Saturday, February 2, 2008


import Control.Monad
import Data.Char
import Data.List
import System.Console.GetOpt
import System.Environment
import System.Exit
import System.IO
import Text.Printf


import System( getArgs )


main = do
args <- getArgs
-- print $ " The input args are :" ++ ( ( ((++ " ") . (show ) =<<) ) $ ( map read args ::[Int]) )
printf $ nqueens $ ( map read args ::[Int])!!0

qoer,noha,nova,nosea,noswa::(Integral n, Enum n ,Ord n)=> n -> [[n]] -- take size of board and return a list of clauses.

qoer n = [ [ (n* (j-1) + i ) | i <- [1..n] ] ++ [0] | j <- [1..n] ]
noha n = [ [ -1 *(n * ( j-1) + i ) , -1* (n * ( j-1) + k) , 0 ] | j <- [1..n] , i <- [ 1.. (n-1)] , k <- [ (i+1)..n] ]
nova n = [ [ -1 *(n * ( j-1) + i ) , -1*( n * ( k-1) + i) , 0 ] | i <- [1..n] , j <- [ 1.. (n-1)] , k <- [ (j+1)..n] ]
nosea n = [ [ -1 *(n * ( j-1) + i ) , -1*( n * ( j-1 + k ) + i + k ) , 0 ] | i <- [1..(n-1)] , j <- [ 1.. (n-1)] , k <- [1..(n*n)] , ( ( ( i+k) <= n ) && ( ( j+k) <=n ) ) ] -- bugs lurk here
noswa n = [ [ -1 *(n * ( j-1) + i ) , -1*( n * ( j-1 + k ) + i - k ) , 0 ] | i <- [2..n] , j <- [ 1.. (n-1)] , k <- [1..(n*n)] , ( ( ( i-k) >= 1 ) && ( ( j+k) <=n ) ) ] -- bugs lurk here

generate::(Integral n, Enum n, Ord n) => n -> [[n]] -- -- take size of board and return a list of clauses.
generate n = ( qoer n) ++ (noha n) ++ (nova n) ++ (nosea n) ++ (noswa n)

printclause::(Integral n, Enum n, Ord n) => [n]->String
printclause l = (((++" ").show) =<< ( init l)) ++ (show ( last l) )

nqueens::(Integral n, Enum n, Ord n) => n -> String
nqueens nq = (header nv nc ) ++ unlines ( map printclause clauses )
where
clauses = generate nq
nc = genericLength clauses
nv = nq *nq

header::(Integral n, Enum n, Ord n)=>n->n->String
header nv nc ="p cnf " ++ (show nv )++ " " ++ ( show nc )++ "\n"

No comments: