[Mono-list] 11 Queens problem slow on mono
dtelford719
Doug at DougTelford.com
Tue Jan 10 20:33:42 EST 2012
Per your request, this is the code for the 11 queens problem:
open System
(* member of a list. If have F# powerpack can use List.contains *)
let rec mem x l1 =
if l1 = [] then false
else if x = (List.head l1) then true
else (mem x (List.tail l1));;
(* are 2 queens safe from each other *)
let rec safe (x1, y1) (x2, y2) =
x1 <> x2 && y1 <> y2 && x2 - x1 <> y2 - y1 && x1 - y2 <> x2 - y1 ;;
(* generate possible solutions *)
let ps n =
[ for i in 1..n do
for j in 1..n do
yield (i,j) ] ;;
(* actually don't use print, commented out *)
let print n qs =
for x in 1 .. n do
for y in 1 .. n do
printf "%s" (if mem (x, y ) qs then "Q" else "." )
printf "\n" ;;
(* primary routine *)
let rec search f n qs ps accu =
match ps with
| [] when List.length qs = n -> f qs accu
| [] -> accu
| q::ps ->
search f n qs ps accu
|> search f n (q::qs) (List.filter (safe q) ps) ;;
(* solve for n queens on an n x n board *)
let solve n =
let f qs i =
(* print n qs *) (* don't print solutions *)
i + 1
search f n [] (ps n) 0;;
(* time execution *)
let time f x =
let timer = new System.Diagnostics.Stopwatch()
timer.Start()
try f x finally
printf "Took %d milliseconds \n" timer.ElapsedMilliseconds
(* initial execution *)
let result = time solve 11;;
printf "number of solutions = %d \n" result;;
--
View this message in context: http://mono.1490590.n4.nabble.com/11-Queens-problem-slow-on-mono-tp4274943p4284143.html
Sent from the Mono - General mailing list archive at Nabble.com.
More information about the Mono-list
mailing list