代码如下:
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)
这篇博客探讨了如何通过活动模式(Pattern Matching)来改进八皇后问题的递归搜索算法,减少了代码复杂性并提高了可读性。文中展示了如何定义`isValid`函数检查皇后冲突,以及如何在`search`函数中应用活动模式来更新和递归搜索解决方案。最终,通过示例代码展示了优化后的算法在解决8x8棋盘上的八皇后问题。
258

被折叠的 条评论
为什么被折叠?



