D9Q1 n皇后问题

题目来源: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)
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值