数独空单元格候选值计算脚本问题:3x3宫格筛选失效及append异常
数独候选值计算脚本问题修复
你的代码主要有三个关键问题导致宫格筛选失效,同时append操作逻辑混乱:
问题分析
- 宫格遍历提前返回:在3x3宫格的嵌套循环里,第一次迭代就执行了
return True,这意味着宫格只检查了第一个单元格就直接返回,根本没完成整个3x3区域的检查,自然无法正确筛选宫格内的重复值。 - 误用内置类型名:直接用
list作为存储候选值的变量名,这会覆盖Python内置的list类型,导致后续代码出现不可预期的错误。 - append时机错误:把添加候选值的操作放在宫格循环内部,无论n是否符合条件都会执行,完全违背了候选值的判断逻辑。
修正后的代码
# 先定义一个全局或局部的候选值列表,不要用list作为变量名 candidates = [] def possible(y, x, n): global grid, candidates # 检查行 for i in range(9): if grid[y][i] == n: return False # 检查列 for i in range(9): if grid[i][x] == n: return False # 计算3x3宫格的起始坐标 x0 = (x // 3) * 3 y0 = (y // 3) * 3 # 遍历整个3x3宫格 for i in range(3): for j in range(3): if grid[y0 + i][x0 + j] == n: return False # 只有当行、列、宫格都没有n时,才将其加入候选值列表 candidates.append([y+1, x+1, n]) return True
使用说明
- 提前初始化
candidates列表,避免每次调用函数时重复创建或覆盖。 - 调用
possible(y, x, n)前,确保grid是全局的9x9数独数组,y和x是0-based的空单元格坐标,n是1-9的待检查数字。 - 遍历所有空单元格和1-9的数字,调用该函数即可收集所有有效候选值。
内容的提问来源于stack exchange,提问作者Gulliver05
相关产品推荐
相关产品推荐

