解题关键:
我们用数组 x[a]=i 来表示第 a 个皇后的位置在第 a 行第 i 列,我们不用考虑是否在同一行的问题(因为a代表行数),我们只用判断之前的 1 到 a-1 个皇后的位置和当前第 a 个皇后的位置是否属于同一列或者斜线。
判断是否属于同一列: 就判断 x[a]是否等于 x[i]; 判断是否属于同一斜线:等同于判断行之差是否等于列之差也,即 abs(x[k]-x[i])||x[k]==x[i]。
import sys
def check(a):
global n, sum
if a > n: # 说明这一轮的放置已经完成,存在这一种放法,所以sum++
sum += 1
else:
return False
return True
def judge(a):
for i in range(1, a): # 传入的a代表行数(或者是第a个皇后),所以比较范围从第一行到第a行
if abs(a - i) == abs(x[a] - x[i]): # 判断是否在同一斜线上等同判断行之差是否等于列之差
return 0
elif x[a] == x[i]: # 判断是否在同一列上
return 0
return 1
def DFS(a):
if check(a):
return # 该return仅结束其中一次循环,变相有很多循环在执行
for i in range(1, n + 1):
x[a] = i # 即第a个皇后放置在第i列
if judge(a): # 判断是否可以放置在该处
DFS(a + 1)
else:
continue # 即使第i列不可以,continue之后,x[a]的值也会改变,不影响后续
n = int(sys.stdin.readline().strip())
sum = 0
x = [0 for i in range(n + 1)] # 下标代表行,值代表列
DFS(1)#代表从第一行第一个皇后开始放置
print(sum)