Python递归回溯数独求解器

时间:2013-10-23 22:23:17

标签: python algorithm recursion

我正在为suduko解算器编写一个递归回溯算法。在suduko看起来很可怕。

代码:

def recursiveBacktrack(board):
  if(checkEntireBoard(board)):
    return board
  else:
    for node in board:
      if(node.val == "."):
        for val in (1,2,3,4,5,6,7,8,9):
           if(checkNodeConstraintsOk(board, node, val)):
             node.val = val
             posNewBoard = recursiveBacktrack(board)
             if(posNewBoard != None):
               return posNewBoard
             else:
              node.val = "."
         return None

board由节点对象组成。每个节点对象都有一个(x,y)用于电路板,一个值是一个数字或一个没有赋值的周期,一个平方值(它所在的suduko平方)。

我知道我的方法checkEntireBoardcheckNodeConstraintsOk都有效。 checkEntireBoard检查电路板是否正确解决,如果suduko游戏的约束成立,checkNodeConstraintsOk检查是否要将给定节点设置为给定板上的给定值。

出于某种原因,我认为上面的算法工作不正常(参见下面的输出),我已经完全按照伪代码进行了递归回溯,并且没有发现任何错误。所以我必须弄清楚错误在于我对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上打开代码审查。但从我所看到的问题出现在上面。

修改

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

EDIT2

解决了感谢彼得

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  
------------------------------

1 个答案:

答案 0 :(得分:2)

检查初始节点值的类型。如果使用val = "1"代替val = 1初始化它们,那么您的checkNodeConstraintsOk函数将不会发现冲突,因为值不相等。我看到你的例子中没有一个不正确的值与递归回溯器添加的值相冲突,只是起始值,所以我怀疑这是问题所在。