题解:蓝桥云课 1508 N皇后问题
【题目来源】
蓝桥云课:1.N皇后问题 - 蓝桥云课 (lanqiao.cn)
【题目描述】
在 \(N×N\) 的方格棋盘放置了 \(N\) 个皇后,使得它们不相互攻击(即任意 \(2\) 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 \(45\) 角的斜线上。你的任务是,对于给定的 \(N\),求出有多少种合法的放置方法。
【输入】
输入中有一个正整数 \(N≤10\),表示棋盘和皇后的数量
【输出】
为一个正整数,表示对应输入行的皇后的不同放置数量。
【输入样例】
5
【输出样例】
10
【算法标签】
《蓝桥云课 1508 N皇后问题》 #DFS#
【代码详解】
# 课堂练习
def dfs(x):
#第x层的皇后
if x==n+1:
global ans
ans += 1
return
#第x层的皇后枚举每一列
for y in range(1, n+1):
#当前的坐标(x,y),要求当前列,当前主对角线、副对角线不能被攻击到
if vis1[y] or vis2[x+y] or vis3[x-y+n]:
continue
#此时(x,y)是合法点
#打标记、进入下一层搜索、回到该层、清空标记
vis1[y]=vis2[x+y]=vis3[x-y+n]=True
dfs(x+1)
vis1[y]=vis2[x+y]=vis3[x-y+n]=False
n = int(input())
#三个数组分别表示列、主对角线、副对角线是否被标记
vis1=[False]*(n+1)
vis2=[False]*(2*n+1)
vis3=[False]*(2*n+1)
ans = 0
dfs(1)
print(ans)
【运行结果】
5
10
浙公网安备 33010602011771号