fork(2) download
  1. import Data.List
  2. --import Data.List.Split (chunksOf)
  3.  
  4. solve field | elem '-' field = filter (not.null) $ concatMap solve $ nextstep field
  5. | otherwise = [field]
  6.  
  7. nextstep field | m == 0 = [[]]
  8. | otherwise = map (\c -> take i field ++ c : drop (i+1) field) v
  9. where
  10. freecells = elemIndices '-' field
  11. (m, i, v) = minimum $ map (\i -> let v = variants i in (length v,i,v)) freecells
  12.  
  13. variants i = "123456789" \\ (rownums ++ colnums ++ squnums) where
  14. (r,c) = divMod i 9
  15. rownums = take 9 . drop (r*9) $ field
  16. colnums = map ((field!!).(+c)) [0,9..80]
  17. [r',c'] = map (\x -> x `div` 3 * 3) [r,c]
  18. squnums = concatMap (take 3 . flip drop field . (\x -> (x+r')*9+c')) [0..2]
  19.  
  20. showres fields | null fields = "No solution"
  21. -- | otherwise = (' ':).intersperse ' '.unlines.chunksOf 9.head $ fields
  22. | otherwise = head fields
  23.  
  24. main = do
  25. let f = "--7---34-\
  26. \2---38---\
  27. \1--4----2\
  28. \-2-9-64--\
  29. \-7--4--8-\
  30. \--58-2-1-\
  31. \8----4--1\
  32. \---65---9\
  33. \-32---7--"
  34. putStr $ showres $ solve f
Success #stdin #stdout 0.01s 4556KB
stdin
Standard input is empty
stdout
597261348246538197183497562328916475971345286465872913859724631714653829632189754