如何将已求解数独网格保存为全局变量?解决外部打印显示初始值问题
解决数独求解后外部打印grid仍为初始值的问题
问题原因
你的solve函数采用回溯算法,递归调用完成后执行了grid[row][column] = 0——这是为了尝试当前单元格的其他可能数字。但当找到完整解时,回溯过程会把所有填充的数字逐一重置为0,最终grid回到初始状态。函数内部打印的是找到解瞬间的grid(此时还未开始回溯重置),所以外部打印时已经恢复初始值。
解决方案
修改solve函数,让它返回是否找到解的布尔值。当递归找到完整解时,直接返回True,跳过后续的重置操作,这样就能保留求解后的grid状态。
修改后的完整代码
import random import numpy as np # 定义初始数独网格,示例为全0(用于生成新数独),也可以替换为待求解的部分填充网格 grid = [[0 for _ in range(9)] for _ in range(9)] def possible(row, column, number): global grid # 检查当前行是否存在重复数字 for i in range(9): if grid[row][i] == number: return False # 检查当前列是否存在重复数字 for i in range(9): if grid[i][column] == number: return False # 检查当前3x3宫格是否存在重复数字 x0 = (column // 3) * 3 y0 = (row // 3) * 3 for i in range(3): for j in range(3): if grid[y0+i][x0+j] == number: return False return True def solve(): global grid number_list = [1,2,3,4,5,6,7,8,9] random.shuffle(number_list) # 打乱数字列表,生成不同的解/新数独 for row in range(9): for column in range(9): if grid[row][column] == 0: for number in number_list: if possible(row, column, number): grid[row][column] = number # 递归求解,若找到完整解则直接返回True,不再重置当前单元格 if solve(): return True # 未找到解时才重置当前单元格,尝试下一个数字 grid[row][column] = 0 # 当前单元格所有数字都尝试失败,返回False return False # 找到完整解,打印并返回True print("求解完成(内部打印):") print(np.matrix(grid)) return True # 调用求解函数 solve() # 外部打印求解后的网格 print("\n求解完成(外部打印):") print(np.matrix(grid))
关键修改点
- 为solve函数添加布尔返回值:找到解时返回True,未找到时返回False。
- 在递归调用后判断返回值,若为True(已找到完整解),则跳过
grid[row][column] = 0的重置操作,直接返回True,终止回溯过程。 - 确保初始grid变量已正确定义(示例中为全0网格,用于生成新数独,可替换为待求解的网格)。
内容的提问来源于stack exchange,提问作者Nathan Wang
相关产品推荐
相关产品推荐

