"""
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)
蓝桥杯-N皇后问题
于 2024-04-02 23:42:32 首次发布
该篇文章介绍了如何使用Python解决八皇后问题,通过递归和回溯法策略,利用列、主对角线和副对角线的标记来避免冲突,最终计算出所有可能的解的数量。
摘要由CSDN通过智能技术生成