aboutsummaryrefslogtreecommitdiff
path: root/comparison/SML/nqueen-12.sml
blob: 9605312c5770ad94f1a769f30021cd55db9680be (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
fun member x [] = false
| member x (y::ys) = if x=y then true else (member x ys);

(* check for (0,q) and (k, qpos[col=k]) where k=1... 
http://www.nct9.ne.jp/m_hiroi/func/haskell06.html
    0 1 2    --> 
  *-------------
 1| . . . . . .
 2| . . . -3. .  5 - 3 = 2
 3| . . -2. . .  5 - 2 = 3
 4| . -1. . . .  5 - 1 = 4
 5| Q . . . . .  Q position is 5  
 6| . +1. . . .  5 + 1 = 6
 7| . . +2. . .  5 + 2 = 7
 8| . . . +3. .  5 + 2 = 8
  *-------------
*)
fun threat k m [] = false
  | threat k m (x::xs) =
   if (k = x-m) orelse (k = m-x) then true
    else (threat (k+1) m xs);


fun queen1 0 b n = []
  | queen1 m b n =
    if (member m b) orelse (threat 1 m b) then (queen1 (m-1) b n)
    else if (length b) = (n-1) then [m::b]@(queen1 (m-1) b n)
         else (queen1 n (m::b) n) @ (queen1 (m-1) b n);

fun queen n = queen1 n [] n;

val n = 12;
length (queen n);