备赛蓝桥杯【大学python组】10 n皇后问题

本文介绍了解决N皇后问题的深度优先搜索算法,探讨如何在N×N棋盘上放置N个皇后避免互相攻击,给出了具体代码实现和N=5时的解法(10种)。
摘要由CSDN通过智能技术生成

【题目描述】

N×N 的方格棋盘放置了  N 个皇后,使得它们不相互攻击(即任意 2 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45 角的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法。

【输入描述】

输入中有一个正整数 N≤10,表示棋盘和皇后的数量

【输入】

5

【输出】

10

【解题思路】

用DSF解题

【代码】

import os
import sys
# 请在此输入您的代码:
n = int(input())
x = [0] * 15
sum_count = 0

def PD(k):#边界k:当前正在考虑放置第 k 行的皇后
    for i in range(1, k):
        if abs(k - i) == abs(x[k] - x[i]) or x[k] == x[i]:
          #判断是否为主对角线或副对角线or同一列
            # 列表 x 存储了每行皇后的列坐标
# 假设 x = [0, 2, 4, 1, 3],abs(2-1) != abs(2-0) 且 x[2] != x[1],因此 for 循环结束
            return False
    return True#表示第 i 行的皇后可以放置在当前位置

def check(a):#检查当前是否已经摆放完所有皇后
    global sum_count
    # 在函数内部使用全局变量 sum_count,并且在函数内部可以对其进行赋值操作,而不会被当作局部变量处理
    if a > n:
        sum_count += 1#摆完了
    else:
        return False#没摆完,继续摆
    return True
# 无论是满足条件还是未满足条件,都会返回 True,表示函数执行结束
def DFS(a):
    if check(a):#调用check判断是否摆完
        return#如果摆完直接返回
    for i in range(1, n+1):
        x[a] = i#分别放在第i列
        if PD(a):#是否冲突
            DFS(a + 1)#无冲突则在下一行添加皇后

if __name__ == "__main__":
    DFS(1)#开始尝试在第一行放置皇后
    print(sum_count)

【结果截图】

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值