import System.Environment (getArgs)
data Board = Board {
}
-- | Checks whether the board has a conflict
conflict
:: Board
-> Boolconflict b
= any (==x
) xs
|| step
(-1) x xs
|| step
1 x xs
where (x:xs) = field b
step _ _ [] = False
step s p (x:xs)
| (s+p) == x = True
-- | Returns all boards one can get by placing a queen in the next column
place :: Board -> [Board]
place b = place' b 1
where place' b s
| s > size b = []
| conflict newboard = rest
where newboard = Board newfield (size b)
newfield = s:(field b)
rest = place' b (s+1)
-- | Returns all boards one can get for the n-th queen problem
placeAll :: Int -> [Board]
placeAll n = foldl (>>=) [Board [] n] (replicate n place)
-- | Creates a String from a board
prettyPrint :: Board -> String
prettyPrint b = unlines.map prettyLine.field$b
where prettyLine n = replicate (n - 1) '.' ++ "@" ++ replicate ((size b) - n) '.'
-- | Shows the first two solutions obtained by placeAll
main = do
mapM_ putStrLn . map prettyPrint . take 2 . placeAll $ 44
aW1wb3J0IFN5c3RlbS5FbnZpcm9ubWVudCAoZ2V0QXJncykKCmRhdGEgQm9hcmQgPSBCb2FyZCB7CiAgZmllbGQgOjogW0ludF0sCiAgc2l6ZSA6OiBJbnQKfQoKLS0gfCBDaGVja3Mgd2hldGhlciB0aGUgYm9hcmQgaGFzIGEgY29uZmxpY3QKY29uZmxpY3QgOjogQm9hcmQgLT4gQm9vbApjb25mbGljdCBiID0gYW55ICg9PXgpIHhzIHx8IHN0ZXAgKC0xKSB4IHhzIHx8IHN0ZXAgMSB4IHhzCiAgd2hlcmUgKHg6eHMpID0gZmllbGQgYgogICAgICAgIHN0ZXAgXyBfIFtdID0gRmFsc2UKICAgICAgICBzdGVwIHMgcCAoeDp4cykKICAgICAgICAgIHwgKHMrcCkgPT0geCA9IFRydWUKICAgICAgICAgIHwgb3RoZXJ3aXNlICA9IHN0ZXAgKHMrcCkgcCB4cwoKLS0gfCBSZXR1cm5zIGFsbCBib2FyZHMgb25lIGNhbiBnZXQgYnkgcGxhY2luZyBhIHF1ZWVuIGluIHRoZSBuZXh0IGNvbHVtbgpwbGFjZSA6OiBCb2FyZCAtPiBbQm9hcmRdCnBsYWNlIGIgPSBwbGFjZScgYiAxCiAgd2hlcmUgcGxhY2UnIGIgcwogICAgICAgICAgfCBzID4gc2l6ZSBiICAgICAgICA9IFtdCiAgICAgICAgICB8IGNvbmZsaWN0IG5ld2JvYXJkID0gcmVzdAogICAgICAgICAgfCBvdGhlcndpc2UgICAgICAgICA9IG5ld2JvYXJkOnJlc3QKICAgICAgICAgIHdoZXJlIG5ld2JvYXJkID0gQm9hcmQgbmV3ZmllbGQgKHNpemUgYikKICAgICAgICAgICAgICAgIG5ld2ZpZWxkID0gczooZmllbGQgYikKICAgICAgICAgICAgICAgIHJlc3QgICAgID0gcGxhY2UnIGIgKHMrMSkKCi0tIHwgUmV0dXJucyBhbGwgYm9hcmRzIG9uZSBjYW4gZ2V0IGZvciB0aGUgbi10aCBxdWVlbiBwcm9ibGVtCnBsYWNlQWxsIDo6IEludCAtPiBbQm9hcmRdCnBsYWNlQWxsIG4gPSBmb2xkbCAoPj49KSBbQm9hcmQgW10gbl0gKHJlcGxpY2F0ZSBuIHBsYWNlKQoKLS0gfCBDcmVhdGVzIGEgU3RyaW5nIGZyb20gYSBib2FyZApwcmV0dHlQcmludCA6OiBCb2FyZCAtPiBTdHJpbmcKcHJldHR5UHJpbnQgYiA9IHVubGluZXMubWFwIHByZXR0eUxpbmUuZmllbGQkYgogIHdoZXJlIHByZXR0eUxpbmUgbiA9IHJlcGxpY2F0ZSAobiAtIDEpICcuJyArKyAiQCIgKysgcmVwbGljYXRlICgoc2l6ZSBiKSAtIG4pICcuJwoKLS0gfCBTaG93cyB0aGUgZmlyc3QgdHdvIHNvbHV0aW9ucyBvYnRhaW5lZCBieSBwbGFjZUFsbAptYWluID0gZG8KICBtYXBNXyBwdXRTdHJMbiAuIG1hcCBwcmV0dHlQcmludCAuIHRha2UgMiAuIHBsYWNlQWxsICQgNDQK