如何解决数独求解程序中网格出现重复值的问题?
数独求解程序错误修复
你的代码核心问题出在valid函数的执行逻辑和列校验的索引错误上,具体问题及修复如下:
主要问题分析
- 代码执行截断:
valid函数中,行校验完成后直接return True,导致后续的列校验、3×3区块校验代码完全没有执行,这是网格出现重复值的根本原因。 - 列校验索引错误:列校验循环中,你错误使用了
grid[y][i],正确的应该是grid[i][y](y是列索引,需要遍历每一行的该列位置)。 - 3×3区块校验的参数污染:直接修改函数参数
x和y会导致后续逻辑出错,应该使用临时变量存储区块起始坐标。
修复后的完整代码
grid2 = [[5,3,0,0,7,0,0,0,0], [6,0,0,1,9,5,0,0,0], [0,9,8,0,0,0,0,6,0], [8,0,0,0,6,0,0,0,3], [4,0,0,8,0,3,0,0,1], [7,0,0,0,2,0,0,0,6], [0,6,0,0,0,0,2,8,0], [0,0,0,4,1,9,0,0,5], [0,0,0,0,8,0,0,7,9]] def valid(grid, x, y, n): # 校验当前行 for i in range(9): if grid[x][i] == n: return False # 校验当前列(修复索引错误) for i in range(9): if grid[i][y] == n: return False # 校验3×3区块(使用临时变量避免修改参数) block_x = (x // 3) * 3 block_y = (y // 3) * 3 for i in range(3): for j in range(3): if grid[block_x + i][block_y + j] == n: return False return True def sudoku(grid): for x in range(9): for y in range(9): if grid[x][y] == 0: for n in range(1, 10): if valid(grid, x, y, n): grid[x][y] = n result = sudoku(grid) if result is not None: return result grid[x][y] = 0 return return grid # 测试求解 solution = sudoku(grid2) for row in solution: print(row)
修复说明
- 移除了行校验后的
return True,让函数依次执行行、列、区块校验,只有所有校验都通过才返回True。 - 修正列校验的索引为
grid[i][y],确保检查的是当前列的所有行。 - 使用
block_x和block_y存储3×3区块的起始坐标,避免修改原函数参数x和y导致的逻辑混乱。
内容的提问来源于stack exchange,提问作者Armenta
相关产品推荐
相关产品推荐

