You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。
  • 额外逻辑缺陷:现有回溯代码没有终止条件,即便修复索引问题,求解完成后会继续回溯把所有已经填充的数字清空,最终打印的还是原始输入数组。
修复方案
  1. 将行、列检查的循环变量名替换为不和参数冲突的名称,比如val
  2. 给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:36:04