0
为一个任务制作一个数独求解器,我遇到了解决数独的空白单元格的问题。我可以很容易地解决具有独特解决方案的细胞,但是当我遇到具有多种解决方案的单元格(在数独的当前状态下)时,我想转到下一个空白处,尝试填充尽可能多的数独,然后“尝试“价值观并相应地分出我的解决方案。优化数独求解方法
我的问题是,我不知道如何跟踪我所处的空白值。
blank :: Sudoku -> Pos
blank sudoku
| elem '.' $ toString sudoku = ((positInRow `div` 9), (positInRow `mod` 9))
| otherwise = error "no blanks"
where
positInRow = fromJust $ elemIndex '.' $ toString sudoku
nextBlank :: Sudoku -> Pos -> Pos
nextBlank sudoku (x, y)
| elem '.' $ drop (x*9+y) $ toString sudoku = blank (fromString $ drop (x*9+y) $ toString sudoku)
| otherwise = error "no blanks"
这是我尝试的解决方案,但如果我尝试递归解决数独,它会陷入无限循环寻找相同的“nextBlank”如果原来的一个空白不更新的价值数独。
有没有办法正确实现这个功能?