aboutsummaryrefslogtreecommitdiff
let rec member x alist =
  match alist with
    []    -> false
  | y::ys -> if x=y then true else (member x ys);;

let rec threat k m alist =
  match alist with
    []    -> false
  | x::xs ->  if (k = x-m) || (k = m-x) then true
              else (threat (k+1) m xs);;

let rec queen1 m b n =
  match m with
    0 -> []
  | m ->
    if (member m b) || (threat 1 m b) then (queen1 (m-1) b n)
    else if (List.length b) = (n-1) then [m::b]@(queen1 (m-1) b n)
         else (queen1 n (m::b) n) @ (queen1 (m-1) b n);;

let queen n = queen1 n [] n;;

let n = 12;;
let () = print_int (List.length (queen n));