蓝桥杯-N皇后问题

该篇文章介绍了如何使用Python解决八皇后问题,通过递归和回溯法策略,利用列、主对角线和副对角线的标记来避免冲突,最终计算出所有可能的解的数量。
摘要由CSDN通过智能技术生成
"""
https://www.lanqiao.cn/problems/1508/learning/?page=1&first_category_id=1&problem_id=1508
"""
import os
import sys

n = int(input())
ans = 0
# 用三个数组记录列、主对角线、副对角线是否被标记
vis1 = [False] * (n + 1) # vis1[i]标记第i列是否已经有皇后
vis2 = [False] * (2 * n + 1) # 标记某条主对角线上是否有皇后
vis3 = [False] * (2 * n + 1) # 标记某条副对角线上是否有皇后
"""
举个例子: 已知某个皇后位置x行y列(x, y)
                (x-1,y-1)       (x-1,y+1)
                        (x ,y )
                (x+1,y-1)       (x+1,y+1)
可以发现在以(x,y)为中心的主对角线上的点的横纵坐标和为定值x+y, 
副对角线上的点的横纵坐标差为定值x-y, 根据这个特性可将皇后对角线上的位置都进行标记
"""

def dfs(x):
    if x == n:
        global ans
        ans += 1
        return
    
    # 枚举皇后在第x行的列的位置
    for y in range(1, n + 1):
        if vis1[y] is False and vis2[x + y] is False and vis3[x - y + n] is False:
          vis1[y] = True
          vis2[x + y] = True
          vis3[x - y + n] = True
          # 走下一层
          dfs(x + 1)
          # 回溯: 清除标记
          vis1[y] = False
          vis2[x + y] = False
          vis3[x - y + n] = False                 
dfs(0)            
print(ans)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好无聊啊,烦死

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值