let rec safe (x1, y1) (x2, y2) =
x1 <> x2 && y1 <> y2 && x2 - x1 <> y2 - y1 && x1 - y2 <> x2 - y1;;
let rec search f n qs ps accu = match ps with
| [] -> if length qs = n then f qs accu else accu
| q::ps -> search f n (q::qs) (filter (safe q) ps) (search f n qs ps accu)
let rec init n f = if n=0 then [] else f(n-1) :: init (n-1) f
let ps = flatten (init n (fun i -> init n (fun j -> i, j)))
let print qs =
List.iter
(fun (x, y
) -> a
.(y
).[x
] <- 'Q
') qs
;
let sols = search (fun qs -> print qs; (+) 1) n [] ps 0;;
b3BlbiBMaXN0CgpsZXQgcmVjIHNhZmUgKHgxLCB5MSkgKHgyLCB5MikgPQogIHgxIDw+IHgyICYmIHkxIDw+IHkyICYmIHgyIC0geDEgPD4geTIgLSB5MSAmJiB4MSAtIHkyIDw+IHgyIC0geTE7OwoKbGV0IHJlYyBzZWFyY2ggZiBuIHFzIHBzIGFjY3UgPSBtYXRjaCBwcyB3aXRoCiAgfCBbXSAtPiBpZiBsZW5ndGggcXMgPSBuIHRoZW4gZiBxcyBhY2N1IGVsc2UgYWNjdQogIHwgcTo6cHMgLT4gc2VhcmNoIGYgbiAocTo6cXMpIChmaWx0ZXIgKHNhZmUgcSkgcHMpIChzZWFyY2ggZiBuIHFzIHBzIGFjY3UpCgpsZXQgbiA9IHRyeSBpbnRfb2Zfc3RyaW5nIFN5cy5hcmd2LigxKSB3aXRoIF8gLT4gOAoKbGV0IHJlYyBpbml0IG4gZiA9IGlmIG49MCB0aGVuIFtdIGVsc2UgZihuLTEpIDo6IGluaXQgKG4tMSkgZgoKbGV0IHBzID0gZmxhdHRlbiAoaW5pdCBuIChmdW4gaSAtPiBpbml0IG4gKGZ1biBqIC0+IGksIGopKSkKCmxldCBwcmludCBxcyA9CiAgbGV0IGEgPSBBcnJheS5pbml0IG4gKGZ1biBfIC0+IFN0cmluZy5tYWtlIG4gJy4nKSBpbgogIExpc3QuaXRlciAoZnVuICh4LCB5KSAtPiBhLih5KS5beF0gPC0gJ1EnKSBxczsKICBBcnJheS5pdGVyIHByaW50X2VuZGxpbmUgYTs7CgpsZXQgc29scyA9IHNlYXJjaCAoZnVuIHFzIC0+IHByaW50IHFzOyAoKykgMSkgbiBbXSBwcyAwOzsK