【发布时间】:2021-01-08 13:05:11
【问题描述】:
我正在尝试在 Python 中创建自己的数独求解器,但它返回一个空的数独网格。
我尝试在 pythontutor 上可视化我的代码,以便我可以看到问题所在,但第一行的数字是正确的。
所以我不知道为什么它返回一个空网格。通过空网格,我的意思是它返回与开始完全相同的网格。 0 不会被数字替换。
这是我的代码:
board = [
[7, 8, 0, 4, 0, 0, 1, 2, 0],
[6, 0, 0, 0, 7, 5, 0, 0, 9],
[0, 0, 0, 6, 0, 1, 0, 7, 8],
[0, 0, 7, 0, 4, 0, 2, 6, 0],
[0, 0, 1, 0, 5, 0, 9, 3, 0],
[9, 0, 4, 0, 6, 0, 0, 0, 5],
[0, 7, 0, 3, 0, 0, 0, 1, 2],
[1, 2, 0, 0, 0, 7, 4, 0, 0],
[0, 4, 9, 2, 0, 6, 0, 0, 7]
]
def valid(row, col, number):
global board
for i in range(0,9):
if board[row][i]==number:
return False
for i in range(0,9):
if board[i][col]==number:
return False
col_start = (col//3)*3
row_start = (row//3)*3
for r in range(0, 3):
for c in range(0, 3):
if board[row_start+r][col_start+c]==number:
return False
return True
def solve_sudoku():
global board
for row in range(9):
for col in range(9):
if board[row][col]==0:
for number in range(1,10):
if valid(row, col, number):
board[row][col] = number
solve_sudoku()
board[row][col] = 0
return False
print(board)
solve_sudoku()
print(board)
【问题讨论】:
-
什么是“空网格”?
-
通过空网格,我的意思是所有的0都没有被数字代替。我要编辑得更精确
-
嗯嗯,我真的对数独一无所知,但是你的
solve_sudoku函数会检查一个数字是否为零,if board[row][col] == 0:然后你把它改成一个数字:board[row][col] = number然后 在那之后你把它变回零:board[row][col] = 0 -
if board[row][col] == 0:用于回溯。这意味着如果一个案例上没有正确的数字,它将返回到前一个案例。我的意思是也许我错了,因为我仍在努力理解递归性和回溯。但我确定第一行已经成功完成,我不知道它为什么返回输入网格。 -
我已经向您解释过,您对全局
board对象所做的任何更改都会被撤销。想想看。您告诉它更改为某个数字,然后立即告诉它更改回0。相反,不要依赖于改变全局板对象。例如,将 board 作为参数传递,当您进行递归调用时,传递 board 的副本。