要解决这个填数问题,我们可以使用回溯法。这种方法通过尝试每一种可能的数字组合,并在发现冲突时回溯到前一步来寻找其他可能性。
给定如下5x5网格:
[[1, 0, 0, 2, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0],
[5, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
我们要填充所有的空位,使得每行、每列和对角线都不重复。
下面是一段实现上述问题的Python代码:
def is_valid(grid, row, col, num):
for i in range(5):
if grid[row][i] == num or grid[i][col] == num:
return False
if row == col:
for i in range(5):
if grid[i][i] == num:
return False
if row + col == 4:
for i in range(5):
if grid[i][4 - i] == num:
return False
return True
def solve_puzzle(grid):
def backtrack(row, col):
if row == 5:
results.append([row[:] for row in grid])
return
next_row = row + (col + 1) // 5
next_col = (col + 1) % 5
if grid[row][col] != 0:
backtrack(next_row, next_col)
else:
for num in range(1, 6):
if is_valid(grid, row, col, num):
grid[row][col] = num
backtrack(next_row, next_col)
grid[row][col] = 0
results = []
backtrack(0, 0)
return results
# Initial Grid
grid = [
[1, 0, 0, 2, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0],
[5, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
solutions = solve_puzzle(grid)
for solution in solutions:
for row in solution:
print(row)
print()
代码说明:
is_valid
函数用于判断在给定的位置(row, col)填入数字num是否符合规则(即该行、该列和两个主对角线上没有重复的数字)。solve_puzzle
函数包含在第一步定义的backtrack
子函数,后者负责以回溯的方式遍历所有可能的解。- 网格中的初始状态填充为给定的固定数字以及零表示待填充位置。
backtrack
函数依次尝试为每个空位填入从1到5的数字,如果当前选择导致约束条件不合法,便回溯进行下一个尝试。- 最终,所有满足条件的解会被保存在
results
列表中并打印出来。