Created
July 15, 2016 13:08
-
-
Save ishiy1993/2aeb8e6b21765c20613b5cc0bf1a83a3 to your computer and use it in GitHub Desktop.
HaskellでNクイーン問題
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Data.List | |
import System.Environment | |
main :: IO () | |
main = do | |
[n] <- getArgs | |
let ans = solves (read n) | |
mapM_ print ans | |
print $ length ans | |
type Queens = [Int] | |
type State = (Queens,[[Int]]) | |
solves :: Int -> [Queens] | |
solves n = solve n ([],[possible n []]) | |
solve :: Int -> State -> [Queens] | |
solve n (qs,[]) = [] | |
solve n (qs,ss) | length qs == n = qs:(solve n $ back (qs,ss)) | |
| otherwise = solve n $ next n (qs,ss) | |
gen :: Int -> Queens -> [Int] | |
gen i [] = [] | |
gen i (q:qs) = [q-i,q,q+i] ++ (gen (i+1) qs) | |
possible :: Int -> Queens -> [Int] | |
possible n qs = [1..n] \\ (gen 1 qs) | |
back :: State -> State | |
back ((q:qs),([]:ss)) = back (qs,ss) | |
back ((q:qs),(s:ss)) = ((head s):qs,(tail s):ss) | |
back (_,_) = ([],[]) | |
next :: Int -> State -> State | |
next n ([],(s:ss)) = ([head s],(tail s):ss) | |
next n (qs,ss) = let ps = possible n qs | |
in if null ps | |
then back (qs,ss) | |
else ((head ps):qs,(tail ps):ss) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment