【发布时间】:2021-11-16 22:47:08
【问题描述】:
这是解决数独的有效代码:
def is_valid(board, row, col, num):
for i in range(9):
if board[row][i] == num:
return False
for i in range(9):
if board[i][col] == num:
return False
box_row = (row - row % 3)
box_col = (col - col % 3)
for i in range(3):
for j in range(3):
if board[box_row + i][box_col + j] == num:
return False
return True
def solve(board):
for row in range(9):
for col in range(9):
if board[row][col] == 0:
for num in range(1,10):
if is_valid(board, row, col, num):
board[row][col] = num
solve(board)
board[row][col] = 0
return False
print(np.matrix(board))
solve(board)
让我困惑的部分是:
if board[row][col] == 0:
for num in range(1,10):
if is_valid(board, row, col, num):
board[row][col] = num
solve(board)
board[row][col] = 0
return False
这部分是如何工作的?我知道它会将数字分配给当前行和列 THEN,再次运行solve()函数,程序什么时候运行:
board[row][col] = 0
因为据我了解,除非已经有 0,否则代码不会运行。然后程序将检查该号码是否有效。 另外如果没有有效的num [1~9],它不会返回false并退出函数吗?
谈论它让我头晕目眩,我知道这甚至很难解释,我用谷歌搜索了它。
编辑:
这是我正在处理的董事会:
board_1 = [
[3, 0, 6, 5, 0, 8, 4, 0, 0],
[5, 2, 0, 0, 0, 0, 0, 0, 0],
[0, 8, 7, 0, 0, 0, 0, 3, 1],
[0, 0, 3, 0, 1, 0, 0, 8, 0],
[9, 0, 0, 8, 6, 3, 0, 0, 5],
[0, 5, 0, 0, 9, 0, 6, 0, 0],
[1, 3, 0, 0, 0, 0, 2, 5, 0],
[0, 0, 0, 0, 0, 0, 0, 7, 4],
[0, 0, 5, 2, 0, 6, 3, 0, 0]
]
输出:
[[3 1 6 5 7 8 4 9 2]
[5 2 9 1 3 4 7 6 8]
[4 8 7 6 2 9 5 3 1]
[2 6 3 4 1 5 9 8 7]
[9 7 4 8 6 3 1 2 5]
[8 5 1 7 9 2 6 4 3]
[1 3 8 9 4 7 2 5 6]
[6 9 2 3 5 1 8 7 4]
[7 4 5 2 8 6 3 1 9]]
【问题讨论】:
-
@jarmod 我刚刚做了,谢谢
-
如其所写,
solve要么返回False要么返回None并且不打印任何内容。我怀疑print应该缩进到某种程度?可能是 1 级缩进? -
能分享一下print语句的输出吗?那个显示了董事会以前的样子。我怀疑空字段用 0 表示,在这种情况下会有很多零。
标签: python recursion backtracking recursive-backtracking