首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

sudoku slover in Haskell (二)

2012-08-27 
sudoku slover in Haskell (2)继续精简haskell版的sudoku程序,稍微改了一下,这次用了8行,同时性能也提高了

sudoku slover in Haskell (2)

继续精简haskell版的sudoku程序,稍微改了一下,这次用了8行,同时性能也提高了很多,对每个空格的所有解不是通过尝试算出来的,而是直接得出。

?

board = [0,3,4,1,7,0,5,0,0,         0,6,0,0,0,8,3,0,1,         7,0,0,3,0,0,0,0,6,         5,0,0,6,4,0,8,0,7,         0,1,0,9,0,0,0,6,0,         3,0,6,0,0,2,0,0,4,         8,0,0,0,0,9,0,0,2,         1,0,3,7,0,0,0,9,0,         0,0,9,0,3,1,7,4,0]newboard xs ys = foldl (\acc x -> merge (break (==0) acc) x) xs ys where merge (f,0:t) x = f ++ [x] ++ tpointget bd = [1..9] \\ [bd!!(x*9+y) | x<-[0..8], y<-[0..8], x==row||y==col||(f' x, f' y)==(f' row, f' col)] where                                (row, col) = divMod (length (takeWhile (/=0) bd)) 9                                f' x = x `div` 3 * 3nextanswer answer = map (\x->answer++[x]) (pointget $ newboard board answer)sudoku = (iterate (concatMap $ nextanswer) [[]]) !! length (filter (== 0) board)divide bd = unfoldr (\x -> if x == [] then Nothing else Just (splitAt 9 x)) bdmain = mapM_ (\x -> putStrLn "answer:" >> mapM_ print (divide $ newboard board x) >> putStrLn "") sudoku

?改天看看能否继续减少代码行数。

热点排行