题目来源:b站蓝桥杯Python省赛集训p11
题目:
思路:
(1)因为每行,每列,每条主对角线,副对角线都只能有一个皇后,所有可以将四条线都定义成一个一维列表——rows[n],cols[n],maindiag[2*n-1],subdiag[2*n-1]
rows列表存放该行的皇后的列号,初值为-1,表示该行无皇后。
cols列表表示该列有无皇后,初值为0
maindiag列表表示该主对角线有无皇后,初值为0,每条主对角线用row-col+n-1索引
subdiag列表表示该副对角线有无皇后,初值为0,每条副对角线用row+col索引
(2)定义递归函数search(row),搜索row行的皇后位置。遍历每一列,若row行col列的行列和主副对角线都没有皇后,那么暂定皇后位置为row行col列。那么需要将rows[row]设为col,cols[col]=1,maindiag[row-col+n-1]=1,subdiag[row+col]=1。如果行数小于最后一行,那么继续搜索row+1行——search(row+1);如果已经是最后一行,那么即可记一次方案
遍历下一列之前需要初始化此行列正副对角线的皇后
(3)
从第0行开始函数,最后再输出计数器即为答案
——————————————————————————————————————————
代码:
n=8 maindg=[0 for x in range(2*n-1)]#主对角线 subdg=[0 for x in range(2*n-1)]#副对角线 cols=[0 for x in range(n)]#列 rows=[-1 for x in range(n)] cnt=0 def search(row): global cnt for col in range(n): x=row y=col if maindg[x-y+n-1]==0 and subdg[x+y]==0 and cols[y]==0: rows[row]=col maindg[x - y + n - 1] = 1 subdg[x + y] = 1 cols[col] = 1 if row<n-1: search(row+1) else: cnt+=1 print('found') maindg[x - y + n - 1] = 0 subdg[x + y] = 0 cols[col] = 0 rows[row]=-1 search(0) print(cnt)