N Queens Problem
import Control.Monad
import Control.Monad.Writer
import Data.List
diagonal (x1,y1) (x2,y2) = x1 + y1 == x2 + y2
|| x1 - y1 == x2 - y2
nqueens n = execWriter $ f [1..n] 1 []
where f [] _ ps = tell [ps]
f cs r ps = forM_ cs $ \c ->
unless (any (diagonal (r,c)) ps) $
f (delete c cs) (r + 1) ((r,c):ps)
main = print $ nqueens 4
Bibliography
: Writer Monad及其实现的N皇后问题求解 : http://www.kamang.net/node/149page_revision: 0, last_edited: 1199200570|%e %b %Y, %H:%M %Z (%O ago)





