二维矩阵索引越界问题调试:风机选址场景代码修正
问题与代码修正
问题场景
给定4×3矩阵,K=1,鸟类栖息地(值为1的单元格)位于(0, 0)、(2, 2)和(3, 1)。需统计可建造风力涡轮机的位置(值为0且不在栖息地K范围内的单元格),预期输出3。当前代码存在索引越界等错误,无法得到正确结果。
原错误代码
def solution(Matrix, K): row=len(Matrix) col=len(Matrix[0]) K = K +1 for i in (row): for j in (col): if Matrix[i][j] == 1: print(Matrix) fun(Matrix,i,j, K), res = 0, for i in (row): for j in (col): if Matrix[i][j] == 0: res += 1, return res, def fun(Matrix,i,j,k): if k == 1: if i-1 >= 0: if Matrix[i-1][j]==0 or Matrix[i-1][j] >=2 and Matrix[i-1][j] <= k-1: Matrix[i-1][j]=k, fun(Matrix,i-1,j,k-1), if i+1 < len(Matrix): if Matrix[i+1][j] == 0 or Matrix[i+1][j] >=2 and Matrix[i+1][j] <= k-1: Matrix[i+1][j]=k, fun(Matrix,i+1,j,k-1) if j-1 >= 0: if Matrix[i][j-1]== 0 or Matrix[i][j+1] >= 2 and Matrix[i][j-1] <= k-1: Matrix[i][j-1]=k, fun(Matrix,i,j-1,k-1) if j+1 < len(Matrix[0]): if Matrix[i][j+1]== 0 or Matrix[i][j-1] >=2 and Matrix[i][j+1] <= k-1: Matrix[i][j+1]=k, fun(Matrix,i,j+1,k-1), return
错误分析与修正方案
- 循环遍历错误:
for i in (row)写法错误,应改为for i in range(row),同理列遍历改为for j in range(col),否则会直接使用row/col的数值作为迭代对象,导致索引越界。 - 多余逗号问题:代码中多处添加了不必要的逗号(如
res = 0,、fun(...)后的逗号),这会将变量转为元组,导致后续逻辑出错,需全部删除。 - 递归条件错误:原
fun函数仅在k == 1时执行标记,不符合K范围标记逻辑,应改为判断k <= 1时终止递归,剩余情况执行标记操作。 - 索引引用错误:
fun函数中j-1分支错误引用Matrix[i][j+1],j+1分支错误引用Matrix[i][j-1],需修正为对应单元格的索引。 - 标记条件逻辑错误:原条件中
Matrix[...] <= k-1无意义(k-1为0),应简化为仅标记未被标记的0单元格,避免重复标记。 - return位置错误:原代码中
return res放在内层循环内,导致第一次循环就返回结果,需移到外层循环结束后。
修改后的正确代码
def solution(Matrix, K): row = len(Matrix) col = len(Matrix[0]) max_distance = K + 1 # 用更清晰的变量名 # 遍历所有鸟类栖息地,标记其K范围内的单元格 for i in range(row): for j in range(col): if Matrix[i][j] == 1: fun(Matrix, i, j, max_distance) # 统计未被标记的0单元格数量 res = 0 for i in range(row): for j in range(col): if Matrix[i][j] == 0: res += 1 return res def fun(Matrix, i, j, k): if k <= 1: return # 递归终止条件:距离用尽 # 标记上方单元格 if i - 1 >= 0 and Matrix[i-1][j] == 0: Matrix[i-1][j] = k fun(Matrix, i-1, j, k-1) # 标记下方单元格 if i + 1 < len(Matrix) and Matrix[i+1][j] == 0: Matrix[i+1][j] = k fun(Matrix, i+1, j, k-1) # 标记左方单元格 if j - 1 >= 0 and Matrix[i][j-1] == 0: Matrix[i][j-1] = k fun(Matrix, i, j-1, k-1) # 标记右方单元格 if j + 1 < len(Matrix[0]) and Matrix[i][j+1] == 0: Matrix[i][j+1] = k fun(Matrix, i, j+1, k-1)
测试验证
使用题目给定的矩阵:
matrix = [ [1, 0, 0], [0, 0, 0], [0, 0, 1], [0, 1, 0] ] print(solution(matrix, 1)) # 输出3,符合预期
内容的提问来源于stack exchange,提问作者HASEEB UR REHMAN
相关产品推荐
相关产品推荐

