用F#计算8皇后问题
代码如下:
let queen n =
let isValid arr x i =
seq {0..i - 1}
|> Seq.exists (fun j -> x = Array.item j arr || abs (i - j) = abs (x - Array.item j arr))
|> not
let rec search i arr n =
match i >= n with
| true -> 1
| false ->
seq {0..n - 1}
|> Seq.map (fun x ->
match isValid arr x i with
| true -> arr[i] <- x; search (i+1) arr n
| false -> 0)
|> Seq.sum
search 0 (Array.create n 0) n
printfn "%d" (queen 8)
稍微修改一下,利用活动模式:
let queen n =
let (|Valid|_|) (arr:int[]) (i, x) =
let isNotValid =
seq {0 .. (i - 1)}
|> Seq.exists (fun j -> x = arr.[j] || abs (i - j) = abs (x - arr.[j]))
if isNotValid then None else Some Valid
let rec search i arr n =
if i >= n then 1
else
seq {0 .. (n - 1)}
|> Seq.map (fun x ->
match (i, x) with
| Valid arr -> arr[i] <- x; search (i+1) arr n
| _ -> 0)
|> Seq.sum
search 0 [|for _ in 0..n -> 0|] n
printfn "%d" (queen 8)