题目描述
解题思路
在n*n大小的棋盘上放置n个皇后,且要满足3题给的三个条件从这里我们可以得出
1.使用深度优先遍历,当第1行第1列开始,以行为dfs的输入变量,依次遍历每一行的哪一列可以放皇后
2.怎么才算方案加一呢,当你遍历到第n行时,你肯定会在第n行放一个皇后,因为n*n的棋盘放n个皇后还要不同行,你最后一行肯定放一个,当dfs传进来的行数等于皇后个数说明方案数加一
具体情况看代码批注
代码
n=int(input())
col=[-99]*n #这个列表记录每一行的皇后在第几列,这里的初始值设置较大一点不然会影响后面的斜45度判断条件
count=0
def dfs(row):
global n,col,count #声明使用这几个全局变量
if row==n:
count+=1#由于在n*n的棋盘放n只皇后又不重行说明到遍历到最会一行既产生一种可能
else:
for _col in range(n):#每列遍历所有行
flag=True
for _row in range(n):#col[_row]=_col表示皇后存放在了第_row行的第_col列
if _col==col[_row]:
flag=False#说明当前行的当前列
elif abs(row-_row)==abs(_col-col[_row]) and abs(row-_row)<3:
flag=False
if flag:#说明第row行第_col列可以存放
col[row]=_col#标记
dfs(row+1)#为下一行寻找合适的列放入皇后
col[row]=-99#因为要回溯,就是做完了这一行的这一列要换一列。
dfs(0)#从第0行开始
print(count)