Files
kraken/koka_bench/ocaml/nqueens.ml
2022-05-19 00:43:27 -04:00

25 lines
718 B
OCaml

open List;;
let rec safe queen diag xs =
match xs with
| q :: qs -> queen <> q && queen <> q + diag && queen <> q - diag && safe queen (diag + 1) qs
| [] -> true;;
let rec append_safe queen xs xss =
if (queen <= 0) then xss
else if (safe queen 1 xs) then append_safe (queen - 1) xs ((queen :: xs) :: xss)
else append_safe (queen - 1) xs xss;;
let rec extend queen acc xss =
match xss with
| xs :: rest -> extend queen (append_safe queen xs acc) rest
| [] -> acc;;
let rec find_solutions n queen =
if (queen == 0) then [[]]
else extend n [] (find_solutions n (queen - 1));;
let queens n = List.length (find_solutions n n);;
Printf.printf "%8d\n" (queens (int_of_string Sys.argv.(1)));;