【题目描述】
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)
【结果截图】