-- | command line arguments: n s
-- compute vertex cover of size <= s for knight's graph on n x n chess board.
-- (that is, if you put knights there, they control the full board)
-- example: VC 8 12
{-# language PatternSignatures #-}
import Prelude hiding ( not )
import Satchmo.Relation
import Satchmo.Code
import Satchmo.Boolean
import Satchmo.Counting
import Satchmo.Solver.Minisat
-- import Satchmo.Solver.Funsat
import Control.Monad ( guard )
import System.Environment
import System.Timeout
import qualified Data.Array as A
main :: IO ()
main = do
argv <- getArgs
let [ n, s ] = map read argv
Just ( a :: A.Array (Int,Int) Bool ) <- solve $ knight n s
putStrLn $ table a
knight n s = do
a <- relation ((1,1),(n,n))
m <- atmost s $ do
i <- indices a ; return $ a ! i
assert [m]
sequence_ $ do
p <- indices a
return $ assert $ do
q <- indices a
guard $ p == q || reaches p q
return $ a!q
return $ decode a
reaches (px,py) (qx,qy) =
5 == (px - qx)^2 + (py - qy)^2