N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。
# 判断能不能放
def pd(k):
# k是当前行, i是搜索行
# 搜索每个对角线和每一列有没有皇后
for i in range(1, k):
# 对角线
if abs(k - i) == abs(x[k] - x[i]):
return False
# 同一列
elif x[k] == x[i]:
return False
# 都不存在就能放
return True
# 判断边界
def check(a):
if a > n:
global count
count += 1
else:
return False
return True
# 第 a 行
def dfs(a):
# 超出边界, 则结果加1, 并回溯到上一行皇后的位置
if check(a):
return
# 没有超出边界,则开始放下一行的皇后
else:
# 第 i 列
for i in range(1, n + 1):
# 能不能放在这个位置, 第 a 行 第 i 列
x[a] = i
# 能放就放下一个, 不能放就看下一列
if pd(a):
dfs(a + 1)
else:
continue
if __name__ == '__main__':
count = 0
n = int(input())
# 皇后列坐标
x = [0] * (n + 1)
# 从第一行开始搜索
dfs(1)
print(count)