题解:蓝桥云课 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
posted @ 2026-03-04 15:17  团爸讲算法  阅读(0)  评论(0)    收藏  举报