所以我目前正在编写一个数独求解器,并且必须创建求解函数。 考虑:蛮力数独解决Haskell
solve :: Sudoku -> [Maybe Sudoku]
其中数独的是[[Maybe Int]]
。
这是通过蛮力来解决的,所以我递归地检查数独是否可以被解决,是否满了,但是是否中断约束(例如在一行/列/块中重复的数字),否则, 9递归地在第一个找到的空白点直到它工作或直到我知道它永远不会工作。
当我发现第一个空白空间接受1,因为它是新的输入,但后来意识到这不起作用,那么我必须回去并将其更改为2或更改为接下来工作并再次尝试解决。我如何去做这件事?这里是目前的代码我有解决:
solve :: Sudoku -> [Maybe Sudoku]
solve sud
| isSudoku sud && isSolved sud && isOkay sud = [Just sud]
| isSudoku sud && isSolved sud && not (isOkay sud) = [Nothing]
| isSudoku sud && not (isSolved sud) = solve (helper sud (blank sud) False 1)
helper :: Sudoku -> Pos -> Bool -> Int -> Sudoku
helper sud pos check n
| n > 9 || n < 1 || check = sud
| n > 0 && n < 10 && not check =
do
let newSud = (update sud pos (Just n))
helper newSud pos (isOkay newSud) (n+1)
任何投入如何去做到这一点?
编辑:数独是这样实现的:
data Sudoku = Sudoku [[Maybe Int]]
deriving (Eq)
迄今我已经得到了反馈,上面的代码已经解决数独游戏。问题在于当有足够的空白点时,某个地点可以接受多个号码,而不是仅与一个号码一起工作。说一个空白点与数字5和8一起工作,但8是正确的答案,5是不可解决的。然后,我必须回去改变它,并再次尝试解决所有下一个空白。
你应该包括你的'Sudoku'类型的定义。 – ErikR