SHOW:
|
|
- or go back to the newest paste.
1 | import Control.Parallel.Strategies | |
2 | ||
3 | maxDepth :: Int | |
4 | maxDepth = 20 | |
5 | ||
6 | search :: (NFData solution, NFData partial) => | |
7 | Int | |
8 | -> (partial -> Maybe solution) | |
9 | -> (partial -> [partial]) | |
10 | -> partial | |
11 | -> [solution] | |
12 | search depth finished extend current | |
13 | | Just sol <- finished current = [sol] | |
14 | | otherwise = cmap (search (depth+1) finished extend) (extend current) | |
15 | where cmap f = if depth > maxDepth then concatMap f | |
16 | else concat . parMap rseq f | |
17 | ||
18 | type Row = Int | |
19 | type Col = Int | |
20 | ||
21 | queens :: Int -> [[(Row, Col)]] | |
22 | queens n = search 1 goal extend [] | |
23 | where goal sol = if length sol >= n | |
24 | then Just sol | |
25 | else Nothing | |
26 | extend ps = let curRow = length ps | |
27 | in [(curRow, pos):ps | pos<-[1..n], safe (curRow, pos) ps] | |
28 | safe (r, c) ps = not . or $ [c == cc || abs (r - rr) == abs (c - cc) | |
29 | - | | (rr, cc) <- ps ] |
29 | + | | (rr, cc) <- ps ] |
30 | ||
31 | main :: IO () | |
32 | main = print $ length (queens 13) |