Python编写数独求解器出现IndexError索引越界报错如何解决
问题原因
- 核心报错原因是变量名冲突:
check_if_num_valid函数的入参是i(行号)、j(列号),但检查行的循环你写了for i in arr[i]:,循环变量i直接覆盖了原本的行号参数值。如果当前行存在数值为9的元素,循环结束后i就会变成9,后续计算九宫格起始行startRow = (i//3)*3得到9,x+startRow最大会到9+2=11,超出numpy数组0~8的合法索引范围,触发IndexError。 - 额外逻辑缺陷:现有回溯代码没有终止条件,即便修复索引问题,求解完成后会继续回溯把所有已经填充的数字清空,最终打印的还是原始输入数组。
修复方案
- 将行、列检查的循环变量名替换为不和参数冲突的名称,比如
val - 给
build_grid函数增加递归终止条件:遍历完全部格子没有空值(0)时返回True,终止递归避免结果被回溯清空。
修改后完整可运行代码如下:
import numpy as np arr = np.array([[2,5,0,0,3,0,9,0,1], [0,1,0,0,0,4,0,0,0], [4,0,7,0,0,0,2,0,8], [0,0,5,2,0,0,0,0,0], [0,0,0,0,9,8,1,0,0], [0,4,0,0,0,3,0,0,0], [0,0,0,3,6,0,0,7,2], [0,7,0,0,0,0,0,0,3], [9,0,3,0,0,0,6,0,4]]) rows = arr.shape[0] cols = arr.shape[1] def build_grid(): for i in range(0,rows): for j in range(0,cols): if (arr[i][j] == 0): for c in range(1,10): if check_if_num_valid(i,j,c): arr[i][j] = c # 递归返回True说明已经求解完成,直接终止 if build_grid(): return True arr[i][j] = 0 # 所有格子填充完成,返回True终止递归 return True def check_if_num_valid(i,j,num): #check row for val in arr[i]: if (num == val): return False #check column for val in arr[:,j]: if (num == val): return False #check box startRow = (i//3)*3 startCol = (j//3)*3 for x in range(0,3): for y in range(0,3): if arr[x + startRow][y + startCol] == num: return False return True build_grid() print(arr)
内容的提问来源于stack exchange,提问作者Abhiram Saridena
相关产品推荐
相关产品推荐

