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」如果原來的一個空白不更新的價值數獨。
有沒有辦法正確實現這個功能?