嗨,看看 这个已经处理过这个主题的线程,这个线程可能也很有趣.
我试着写一个函数
candidates :: Sudoku -> Pos -> [Int]
Run Code Online (Sandbox Code Playgroud)
给了一个数独
data Sudoku = Sudoku { rows :: [[Maybe Int]] }
deriving ( Show, Eq )
Run Code Online (Sandbox Code Playgroud)
并且position(type Pos = (Int, Int))确定你可以在那里写什么数字,例如在已经包含(1,2,4,7,9,x,x)的数独行中你不能写出最后一个已存在的数字行.另一个问题是检查高度和宽度,因此没有数字出现多次(普通的数独规则).那么关于如何开始的任何建议?
示例:数独>候选示例(0,2)[4,8]
我记得在大学的算法课上做这个项目.我最好的建议,特别是那些在Haskell写作学习而非制作的人,就是写"自上而下".首先,问问自己,你需要做些什么来解决这个问题?然后用描述性函数将其写下来(即使它们尚不存在).然后存根你需要的功能.例如,一个开始可能是:
candidates :: Sudoku -> Pos -> [Int]
candidates s p = union (rowCands s p) (colCands s p) (blockCands s p)
rowCands :: Sudoku -> Pos -> [Int]
rowCands = undefined
colCands :: Sudoku -> Pos -> [Int]
colCands = undefined
blockCands :: Sudoku -> Pos -> [Int]
blockCands = undefined
Run Code Online (Sandbox Code Playgroud)
从这开始,你只需要开始描述自上而下如何解决rowCands问题,直到你回答完所有问题.请注意,有时你会想要写一个类似的函数union,但肯定已经写过了.尝试查看http://haskell.org/hoogle.您可以搜索功能名称甚至键入签名.也许有一个union已经在标准库中编写过的地方?
作为一个有趣的问题,您可以自己回答,它的类型undefined和原因是什么类型检查?它不是一个特殊的关键字; 它只是一个预定义的功能.