今天在写n-皇后python代码时,遇到了这个报错:Traceback (most recent call last):IndexError: list assignment index out of range。
先上结论,trackback其实是一个异常追踪栈,所以应该看最后一个抛出异常的位置,也就是报错信息最后一行。在我这里定位到是 g[x][y]='.'列表越界
代码如下:
N=100
n=int(input())
g=[[0]*n for _ in range(n)]
row,col,dg,udg=[0]*N,[0]*N,[0]*2*N,[0]*2*N
def dfs(x,y,s):
#处理每行遍历完之后的越界问题
if(y>n):
y=0
x=x+1
if(x==n):
if(s==n):
for i in range(n):
print("".join(g[i]))
print("")
return
#不放
g[x][y]='.'
dfs(x,y+1,s)
#放
if (not row[x]) and (not col[y]) and (not dg[x+y]) and (not ugd[y-x+n]):
g[x][y]='Q'
row[x]=1
col[y]=1
dg[x+y]=1
udg[y-x+n]=1
dfs(x,y+1,s+1)
g[x][y]='.'
row[x]=0
col[y]=0
dg[x+y]=0
udg[y-x+n]=0
dfs(0,0,0)
报错如图:
Traceback异常追踪栈, 第一层try catch,如果异常没有被处理,则会跑出去给函数调用者。如果下一层还是没被处理,则继续抛出去。如果抛到最后一层都还是没被处理,那就只能终止程序了,并且打印异常信息,即上述截图的打印过程。
具体的找错误的过程,我们可以通过自己打印异常信息来帮助寻找。既然已经找到了抛出异常的位置,我们可以接住异常,看看是怎么个越界发法。
#不放
try:
g[x][y]='.'
except IndexError as e:
raise ValueError("异常信息{},x:{},y:{}".format(str(e),x,y))
x=0,y=4的时候发生了越界。定位到了原因,我这里下标是从0开始的,按理说y=n-1的时候就应该结束,所以错误代码在这里:
if(y>n):
y=0
x=x+1
应该改为
if(y>=n):
y=0
x=x+1