【发布时间】:2015-07-06 19:08:11
【问题描述】:
我为 Python 中非常简单的数独问题编写了一个数独求解器。它的工作原理是检查每个空方格,如果只有一个可能的数字是合法的,则将空方格替换为该数字。一旦它通过了整个拼图,如果仍然有超过 1 个空方格,它会再次调用新的拼图。我遇到问题的部分是我希望求解器在每次调用结束时检查谜题是否与调用开始时相同,如果它没有改变,这意味着所有剩余的空方块都有超过 1 个可能的值,因此求解器应返回 False 以指示求解器无法解决该特定难题。但是,当我尝试实现这一点时,Solver 只遍历了一次拼图并返回 False。这是我的代码:
def Solver(puzzle):
oldpuzzle = puzzle
count = 0
for row in range(9):
for col in range(9):
if puzzle[row][col] == '0':
possible, numpossible = getPossible(puzzle, row, col)
if numpossible == 1:
puzzle[row][col] = possible[0]
count += puzzle[row].count('0')
if count > 0:
if oldpuzzle == puzzle:
return False
else:
Solver(puzzle)
else:
return True
getPossible() 函数返回一个可能值的列表和列表的长度。
这里是 main() 函数:
定义主():
puzzle = [
['0','2','0','1','7','8','0','3','0'],
['0','4','0','3','0','2','0','9','0'],
['1','0','0','0','0','0','0','0','6'],
['0','0','8','6','0','3','5','0','0'],
['3','0','0','0','0','0','0','0','4'],
['0','0','6','7','0','9','2','0','0'],
['9','0','0','0','0','0','0','0','2'],
['0','8','0','9','0','1','0','6','0'],
['0','1','0','4','3','6','0','5','0']
]
if Solver(puzzle):
print "Solved!"
for row in puzzle:
print ' '.join(row)
else:
print "Failed!"
如何让程序正确比较 for 循环前后拼图的状态?
【问题讨论】:
-
看起来
getPossible()可能会为numpossible返回除1以外的其他内容,这意味着puzzle不会被修改。 -
我不认为是这样,因为如果我在最后删除 if 语句并让 Solver 无限递归并且我每次都添加一个 print 语句,你可以看到它确实改变谜题。另外,我已经能够用这个程序解决一些简单的谜题,我只是遇到了更难的谜题
标签: python global-variables sudoku