此解法学习自左程云老师的《程序员代码面试指南》
皇后放置的规则就是 已经放置皇后的位置的同行 同列 45° 135° 方向均不许有皇后
对于nxn的棋盘,要放满皇后,需每行都放置皇后
因此,准备一个数组record 长度为n
record[i]代表第i行的皇后所在的列数
回溯法
设置递归函数 输入为 i 即之前已经填进去的皇后个数,
record,里面装有了前i个皇后对应的列数
n,棋盘边长
当i==n时,我们记录这时的结果即可
否则 record还没满
即可 递归 填充下一行的皇后位置
在递归时 需要遍历n
遍历到k时 需要判断k是否已经在record里出现过 或者k,record[k]是否与record此前的任一个(i,j)在同一斜线上
若满足上面任何一种情况 k都不能被算作下一个皇后
若都不满足,即可将k记录在record中 并遍历下一层
class Solution:
def __init__(self):
self.res = []
self.base = ''
def solveNQueens(self, n: int) -> List[List[str]]:
if n < 1:
return 0
for kk in range(n):
self.base += '.'
record = []
self.rec(0,[],n)
return self.res
def rec(self,i,record,n):
#在第i列放皇后
if i == n:#已经放了n列 返回1
#print(record)
this_solution = []
for mm in range(n):
this_loc = record[mm]
this_res = self.base
this_res = this_res[:this_loc] + 'Q' + this_res[this_loc+1:]
#this_res[this_loc] = 'Q'
this_solution.append(this_res)
self.res.append(this_solution)
return 0
res = 0
for j in range(n):#对于每一列
if self.isvalid(i,record,j):#j不出现在record的前i个元素里 且 对于每一个比i小的k 有|record[k] - j| != |k-i|
self.rec(i+1,record+[j],n)
return res
def isvalid(self,i,record,j):
for k in range(i):
if j == record[k] or (abs(record[k]-j)==abs(k-i)):
return False
return True