八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。 如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。 而我们今天要挑战的是N皇后的问题,即在NxN 的棋盘上,放置N 个皇后,使得它们不相互攻击(即任意 2 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45° 角的斜线上。 你的任务是,对于给定的 N,求出有多少种合法的放置方法。
x = [0]*50
n = 0
number
def pd(k): #判断该皇后是否与之前存放的皇后存在同一斜线或同一列
for i in range(1,k):
if abs(k-i) == abs(x[k] - x[i]):
return 0
elif x[k] == x[i]:
return 0
return 1
def check(a): #如果a>n,则说明n个皇后都已经存放好,此时方案数加一,并返回上一级
global number
if a>n:
number += 1
else:
return False
return True
def DFS(num):
if check(num): #判断n个皇后是否已经全部放好
return
else:
for i in range(1,n+1): #循环条件是列数,从第一列开始遍历
x[num] = i
if pd(num): #判断该皇后的位置是否与之前的皇后位置处于同一斜线或同一行
DFS(num+1)
else:
continue
n = int(input())
DFS(1)
print(number) #输出方案数
解答:从第一行开始,每一行存放一个皇后,通过判断与其他皇后是否处于同一列或同一行或45度斜线,选出满足题意的解答,使得方案数加一。