{- queens9.out, as produced by this program, is 32032 bytes -}
main = writeQueens 9
writeQueens n = writeFile fn (concatMap showBoard (queens n))
where
fn = "queens" ++ show n ++ ".out"
showBoard board = concatMap showRow board ++ "\n"
where
size = length board
dots = replicate size '.'
showRow n = take (n - 1) dots ++ "X" ++ take (size - n) dots ++ "\n"
queens b = queens' b
where
queens' 0 = [[]]
queens' n = [ p ++ [n] | p <- queens' (n - 1), n <- [1..b], safe p n ]
safe p n = and [ not (check (i, j) (m, n)) | (i, j) <- zip [1 .. l] p]
where l = length p; m = l + 1
check (i, j) (m, n) = j == n || i + j == m + n || i - j == m - n