Java 数独解算器,特例解算器

Java 数独解算器,特例解算器,java,recursion,sudoku,backtracking,Java,Recursion,Sudoku,Backtracking,我正在做一个数独解算器,它带有递归回溯功能,除了一件事之外,它几乎已经完成了。如果我在拼图的某个地方放上重复的东西(例如,1,1在上角),它就可以永远继续寻找解决方案,即使它不是一个可解的拼图 非常感谢您的帮助 Rob你知道的回溯方法是当你的谜题遇到矛盾时,所以在每一步你都应该运行一个“验证”方法,如果谜题是非法的,那么你的最后一步就是非法的 当你发现你的移动是非法的,你可以递归地回溯并继续 另外,请注意,这是一种相当幼稚的方法,也许一些数独专家有更好的算法,但这种蛮力应该可以做到这一点。你知道

我正在做一个数独解算器,它带有递归回溯功能,除了一件事之外,它几乎已经完成了。如果我在拼图的某个地方放上重复的东西(例如,1,1在上角),它就可以永远继续寻找解决方案,即使它不是一个可解的拼图

非常感谢您的帮助


Rob

你知道的回溯方法是当你的谜题遇到矛盾时,所以在每一步你都应该运行一个“验证”方法,如果谜题是非法的,那么你的最后一步就是非法的

当你发现你的移动是非法的,你可以递归地回溯并继续


另外,请注意,这是一种相当幼稚的方法,也许一些数独专家有更好的算法,但这种蛮力应该可以做到这一点。

你知道的回溯方法是当你的谜题遇到矛盾时,所以在每一步你都应该运行“验证”方法,如果拼图是非法的,那么你的最后一步就是非法的

当你发现你的移动是非法的,你可以递归地回溯并继续


另外,请注意,这是一种相当幼稚的方法,也许一些数独专家有更好的算法,但这种蛮力应该可以做到这一点。

您希望检测到无效的情况,因此您应该在调用解算器之前检查它。您的解算器本身不会创建无效的解决方案…

您希望检测到无效的情况,因此您应该在调用解算器之前检查它。解算器本身不会创建无效的解…

关于重复项,我建议为每个单元格保留一个可能的数字列表,当您尝试解算单元格时,您可以将此列表与匹配的行、列和框进行比较,这样可以防止创建重复项。有了这一点,你可以解决更容易的难题,而无需回溯。如果遇到问题,请使用回溯继续…

关于重复项,我建议为每个单元格保留一个可能的数字列表,当您尝试求解单元格时,您可以将此列表与匹配的行、列和框进行比较,这样可以防止创建重复项。有了这一点,你可以解决更容易的难题,而无需回溯。如果你陷入困境,那么使用回溯继续…

这不一定是答案,但它应该对你有所帮助。我曾经为一个宏程序做过类似的事情,这是目前评级最高的一个

数独解算器可能是一个相当大的挑战。判断一个动作是否正确的唯一方法是它是绝对的还是后来被证明的。这可能会导致相当大的挑战,因为最终是基于当前的形势和行动。这意味着您可以将其作为排列处理。你可以遍历每一个方块,找出它可能包含的数字。从那里,你可以得到一个或两个定义的正方形。基于此,有许多可能的方法可以到达终点

当谜题被解决(没有错误-每个方块都被填满)或存在错误时,将定义“终点”

基于此,您可以将每个移动视为一个节点,然后围绕可能的移动构建一个树系统

例如:

8 7 1   2 _ _   6 9 3
2 9 6   3 8 7   1 _ _
这只是一个小例子,但基于此,我们可以分别扫描每行、每列,然后生成可能的数字:

(5, 1) -> [4, 5]
(6, 1) -> [4, 5]
(8, 2) -> [4, 5]
(9, 2) -> [4, 5]
基于这一点以及给我们提供的解决方案,我们可以看到有4种可能的解决方案:

8 7 1   2 4 5   6 9 3
2 9 6   3 8 7   1 4 5
-或-

-或-

-或-

虽然这些信息不足以解决整个谜题并找出哪一个是“正确的”,但这些信息可以被标准化并用于创建类似的系统,并很快找到解决方案

因此,您可以将所有4种可能性添加到一棵树中,每种可能性都是从原始树分支而来的:

8 7 1   2 _ _   6 9 3
2 9 6   3 8 7   1 _ _
然后递归地处理它们

希望这有帮助

这不一定是答案,但应该对你有所帮助。我曾经为一个宏程序做过类似的事情,这是目前评级最高的一个

数独解算器可能是一个相当大的挑战。判断一个动作是否正确的唯一方法是它是绝对的还是后来被证明的。这可能会导致相当大的挑战,因为最终是基于当前的形势和行动。这意味着您可以将其作为排列处理。你可以遍历每一个方块,找出它可能包含的数字。从那里,你可以得到一个或两个定义的正方形。基于此,有许多可能的方法可以到达终点

当谜题被解决(没有错误-每个方块都被填满)或存在错误时,将定义“终点”

基于此,您可以将每个移动视为一个节点,然后围绕可能的移动构建一个树系统

例如:

8 7 1   2 _ _   6 9 3
2 9 6   3 8 7   1 _ _
这只是一个小例子,但基于此,我们可以分别扫描每行、每列,然后生成可能的数字:

(5, 1) -> [4, 5]
(6, 1) -> [4, 5]
(8, 2) -> [4, 5]
(9, 2) -> [4, 5]
基于这一点以及给我们提供的解决方案,我们可以看到有4种可能的解决方案:

8 7 1   2 4 5   6 9 3
2 9 6   3 8 7   1 4 5
-或-

-或-

-或-

虽然这些信息不足以解决整个谜题并找出哪一个是“正确的”,但这些信息可以被标准化并用于创建类似的系统,并很快找到解决方案

因此,您可以将所有4种可能性添加到一棵树中,每种可能性都是从原始树分支而来的:

8 7 1   2 _ _   6 9 3
2 9 6   3 8 7   1 _ _
然后递归地处理它们


希望这有帮助

要实现Validate类,您不能只编写
Validate.Validate()求解方法的内部?希望能有所帮助。

要实现Validate类,您不能只编写
Validate.Validate()求解方法的内部?希望能有所帮助。

我建议您(或者如果您正在使用IntelliJ)逐行检查您的程序。我认为应该使用solve方法,但不完全确定如何编写它。也许是另一种冰毒