Python递归回溯suduko解算器
我正在为suduko解算器编写一个递归回溯算法。在苏独子似乎很糟糕 代码:Python递归回溯suduko解算器,python,algorithm,recursion,Python,Algorithm,Recursion,我正在为suduko解算器编写一个递归回溯算法。在苏独子似乎很糟糕 代码: boards由节点对象组成。每个节点对象都有一个用于板的(x,y)、一个数字或无赋值的周期值以及一个平方值(它所在的suduko平方) 我知道,我的方法checkEntireBoard和checkNodeConstraintsOk都有效checkEntireBoard检查棋盘是否正确求解,并且checkNodeConstraintsOk检查如果suduko游戏的约束为真,我是否将给定的节点设置为给定棋盘上的给定值 出于某
board
s由节点对象组成。每个节点对象都有一个用于板的(x,y)、一个数字或无赋值的周期值以及一个平方值(它所在的suduko平方)
我知道,我的方法checkEntireBoard
和checkNodeConstraintsOk
都有效checkEntireBoard
检查棋盘是否正确求解,并且checkNodeConstraintsOk
检查如果suduko游戏的约束为真,我是否将给定的节点设置为给定棋盘上的给定值
出于某种原因,我认为我上面的算法工作不正常(请参见下面的输出),我严格遵循了递归回溯的伪代码,没有发现任何错误。因此,我必须指出,错误在于我对python的了解不足
------------------------------
7 5 9 | . 4 . | . . .
6 8 . | 5 . . | . 4 .
. 3 . | 2 . 9 | 5 . .
------------------------------
5 6 . | 1 . . | 9 . .
. . 3 | . . . | 1 . .
. . 1 | . . 6 | . 3 7
------------------------------
. . 5 | 3 . 7 | . 9 .
. 7 . | . . 8 | . 5 3
. . . | . 6 . | 7 2 1
------------------------------
Found Solution
------------------------------
7 5 9 | 1 4 2 | 3 4 5
6 8 1 | 5 3 4 | 2 4 6
2 3 3 | 2 5 9 | 5 1 7
------------------------------
5 6 2 | 1 1 3 | 9 5 4
1 3 3 | 2 4 5 | 1 6 8
4 5 1 | 6 7 6 | 1 3 7
------------------------------
3 1 5 | 3 2 7 | 4 9 9
5 7 4 | 3 6 8 | 7 5 3
6 2 7 | 4 6 1 | 7 2 1
------------------------------
如果回溯算法中没有显示错误,我将在codereview.stack上打开代码复查。但从我所看到的情况来看,问题就在上面
编辑
编辑2
谢谢你,彼得
Found Solution
------------------------------
7 5 9 | 6 4 3 | 8 1 2
6 8 2 | 5 7 1 | 3 4 9
1 3 4 | 2 8 9 | 5 7 6
------------------------------
5 6 7 | 1 3 2 | 9 8 4
8 2 3 | 7 9 4 | 1 6 5
9 4 1 | 8 5 6 | 2 3 7
------------------------------
4 1 5 | 3 2 7 | 6 9 8
2 7 6 | 9 1 8 | 4 5 3
3 9 8 | 4 6 5 | 7 2 1
------------------------------
检查初始节点值的类型。如果它们是用
val=“1”
而不是val=1
初始化的,那么您的checkNodeConstraintsOk
函数将不会发现冲突,因为这些值不相等。我发现示例中的错误值与递归回溯程序添加的值没有冲突,只是起始值,因此我怀疑这就是问题所在。能否为我们提供checkEntireBoard
和checkNodeConstraintsOk
函数,以便人们可以调试您的代码?因为它看起来确实像是checkNodeConstraintsOk
在不应该返回的情况下返回True
;t、 为了检查节点约束,我这样做。我们只关心与我们具有相同价值的节点,而不关心我们自己,因为它显然具有相同的价值。因此,如果我们发现一个节点具有相同的值,并且与我们共享一个x、y或平方值,那么我们就不能将posVal
赋值给inNode
,顺便说一句,“数独的可怕”是一个模棱两可的术语。当然,它得到了错误的答案,但它得到答案的速度可能比正确的算法快得多,而且它不知道它得到的答案是错误的,在这种情况下,大多数人都会很高兴的无论如何,这仍然不足以运行和调试您的代码,而且很有可能错误出现在您没有向我们展示的代码中。我们真的需要帮助。如果我的理论不是问题的话,那么展示板及其已知节点是如何创建的仍然是一个好主意。是的,没错好主意!“我发现示例中的错误值与递归回溯程序添加的值没有冲突,只是起始值,所以我怀疑这就是问题所在”@BumSkeeter:这正是我想要SSCCE的原因。问题不在您的原始代码中,因此我要求提供其余代码。你多给了一点,但问题仍然没有解决,所以我要求更多。你争辩说你不想给它。如果你一开始就给了我们这个问题的代码,你会得到一个即时的解决方案,而不是25分钟后的幸运猜测,而且不会浪费多个想帮助你的人的时间。好吧,好吧,好吧,对不起。从现在起,我将逐字发布代码。我并没有争辩说我不想给出更多的代码,你只做了一条评论,我几乎立即将其作为编辑上传。你的第一条评论是在问题发布几分钟后发布的,我在几秒钟内就把额外的代码放在了那里,看到问题所需的全部代码都在操作的5分钟内就在那里了。我也不认为答案是一个幸运的猜测。彼得有一个非常直观的想法来检查我所做的作业是否彼此一致。如果运气好的话,爱因斯坦可能只是个赌徒。
def checkEntireBoard(board):
for node in board:
if(node.val == "."):
return False
if(not checkNodeConstraintsOk(board, node, node.val)):
return False
return True
def checkNodeConstraintsOk(board, inNode, posVal):
val = posVal
for node in board:
if(node != inNode and node.val == val):
if(node.x == inNode.x or node.y == inNode.y or node.sqr == inNode.sqr):
return False
return True
Found Solution
------------------------------
7 5 9 | 6 4 3 | 8 1 2
6 8 2 | 5 7 1 | 3 4 9
1 3 4 | 2 8 9 | 5 7 6
------------------------------
5 6 7 | 1 3 2 | 9 8 4
8 2 3 | 7 9 4 | 1 6 5
9 4 1 | 8 5 6 | 2 3 7
------------------------------
4 1 5 | 3 2 7 | 6 9 8
2 7 6 | 9 1 8 | 4 5 3
3 9 8 | 4 6 5 | 7 2 1
------------------------------