Mon Aug 6 09:07:55 EDT 2007

-----BEGIN PGP SIGNED MESSAGE-----
Hash: RIPEMD160

Hi,

I wrote a brute-force sudoku solver. It takes a [[Int]] and spits out
the first solution it finds.
Why is it, that

[0,0,0,7,0,6,9,0,0]
[9,0,0,0,0,4,7,0,0]
[7,0,0,0,0,0,4,0,0]
[0,2,7,0,3,5,8,0,0]
[6,9,5,8,2,0,0,0,0]
[0,8,0,0,0,0,5,0,0]
[0,3,0,0,0,0,0,0,0]
[8,7,0,9,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0]

is solved instantly, but when I remove just one number my program takes
forever?

===

import Array
import List
import System

type Field = Array Int (Array Int Int)

isEmpty :: Int -> Bool
isEmpty = (==) 0

done :: Field -> Bool
done a = isFull a && checkField a

isFull::Field -> Bool
isFull a = notElem (0) \$ (concat.(map elems).elems) a

readField = (listArray (1,9).map (listArray (1,9)))

checkField :: Field -> Bool
checkField a =  check (rows a) &&  check (columns a) && check (squares 	a)
where
check b = and \$ ((map ((==1).length)).concat.(map group).clean) b
clean =  map (dropWhile isEmpty.sort)

columns::Field -> [[Int]]
columns a = [[a!i!j|i<-[1..9]]|j<-[1..9]]

rows :: Field -> [[Int]]
rows a = [[a!i!j|j<-[1..9]]|i<-[1..9]]

squares :: Field -> [[Int]]
squares a = [[a!(i+n)!(j+m)|i<-[1..3],j<-[1..3]] |n<-[0,3,6],m<-[0,3,6]]

- -- creates a list of all allowed entries
genMoves :: Field -> [Field]
genMoves a = concat [update a i j|i<-[1..9],j<-[1..9],isEmpty (a!i!j)]
where update b i j= [b //[(i,b!i //[(j,x)])]|x<-[1..9], checkField (b
//[(i,b!i //[(j,x)])])]

play :: [Field] -> Maybe Field
play (f:a)
| done f= Just f
| isFull f= play a
| otherwise = play ((genMoves f)++a)
play [] = Nothing

main :: IO ()
main = do
x <- getArgs
let field = read (x!!0) :: [[Int]]
case erg of
Just a -> putStrLn \$ concat \$ map ((++"\n").show) (rows a)
Nothing -> putStrLn "Es gibt keine Loesung"
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGtx0r11V8mqIQMRsRA7P5AJ9lG3mF3fHpUiyOqCeRVOOEGozp1wCeI80C
RfD/U5y+yEgF0fe+kRwDbUI=
=Ngss
-----END PGP SIGNATURE-----