我正在为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
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上打开一个代码复查。堆栈但从我所看到的情况来看,问题就在上面。
编辑
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
------------------------------
检查初始节点值的类型。如果它们是用val=“1”
而不是val=1
初始化的,那么您的checkNodeConstraintsOk
函数将不会发现冲突,因为这些值不相等。我发现示例中的错误值与递归回溯器添加的值没有冲突,只是起始值,所以我怀疑这就是问题所在。
我正在开发高级培养皿网络编辑器/模拟器。首先,这里有一些词汇 圆圈=位置 矩形=过渡 就地整数 = 标记 过渡状态=防护 我被困在通过过渡的守卫。守卫是一个条件,如果你想执行转换,这需要是真的。我知道我应该以某种方式使用回溯,但我不知道在程序开始之前进入过渡的位置数,所以我不能使用循环,因为我不知道我需要多少个循环。 所以,我想从第一位获取第一个令牌,从第二位获取第一令牌,然后尝试通过守卫,如果通
我的任务是用回溯和递归的方法解决一个迷宫。这更多的是一个关于这个概念的概念问题。 回溯电话是如何接通的?从我所看到的所有示例来看,似乎递归总是在回溯步骤之前立即调用,所以回溯是无法实现的。谁能给我解释一下回溯步骤是怎么达到的?
我目前正在编程一个递归算法解决一个佩格纸牌游戏。 算法需要使用“回溯”的方法来求解棋盘。我想我已经设法得到了一个非常接近正确的解决方案。看来我的代码正确地为所有可解板解板。它似乎也能正确地确定板何时不可解,但只有当钉住的数量不太高时。 有什么想法吗?
我编写了以下程序来递归地实现四色地图定理(简而言之,任何地图只能用4种颜色着色,而没有任何相邻区域是相同的颜色)。一切都在编译,但是我的输出给我错误的数据(每个区域的颜色为-1,而不是现在的值0-3)。我最大的问题是为什么输出不正确。 对于那些想知道的人来说,输入文件是一个邻接矩阵,看起来如下所示: 这是我的代码:
我的问题是,当一个9不能正确添加时,该方法会中断。不知何故,我不知道如何让它回到前一点,并向上数,这将创建一个新的“路径”,所以我想如果我做对了,一切都应该很好。我仍然在使用递归:-/ 正如我所知,我认为Sudokurecrect()做了它应该做的事情。编辑:您可以忽略布尔测试。我知道我不使用它,我试着想一些东西,但显然我不知道如何使用它。 输出为 在那之后,不管检查哪个变体。所以问题是一样的。
我对编码还是很陌生的,我正在尝试一些稍微困难的主题,例如修改数独递归回溯程序的解决方案。最初的解决方案是针对大小为3x3的数独,我希望我的解决方案可以与正常大小的数独(9x9)一起使用。3x3解决方案在这里找到。 我觉得我对算法非常了解:对于网格中的每个列表(包含该单元格的可能值),在每一步尝试每个数字,确保电路板仍然有效,移动到下一个列表,分配一个可能的数字直到其有效,等等。如果当前电路板不正确