Python递归回溯suduko解算器

Python递归回溯suduko解算器,python,algorithm,recursion,Python,Algorithm,Recursion,我正在为suduko解算器编写一个递归回溯算法。在苏独子似乎很糟糕 代码: boards由节点对象组成。每个节点对象都有一个用于板的(x,y)、一个数字或无赋值的周期值以及一个平方值(它所在的suduko平方) 我知道,我的方法checkEntireBoard和checkNodeConstraintsOk都有效checkEntireBoard检查棋盘是否正确求解,并且checkNodeConstraintsOk检查如果suduko游戏的约束为真,我是否将给定的节点设置为给定棋盘上的给定值 出于某

我正在为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  
------------------------------