原题链接:力扣
想法就是利用回溯法递归,更新一个状态图。'X'代表还未知,'Q'代表放入皇后,'.'代表不可用
'''
(0,1) (1,0) (1,2)
'''
class Solution:
def solveNQueens(self, n):
ztt = [['X'] * n for _ in range(n)]
ret = []
ls = []
if n == 1:
return [["Q"]]
def gxztt(zt, i, j): # 更新状态图
for x in range(n):
zt[i][x] = '.'
zt[x][j] = '.'
for y in range(n):
if i - x == j - y or i - x == y - j:
zt[x][y] = '.'
zt[i][j] = 'Q'
def dfs(zt, i): # 回溯递归
if i == n:
for p in range(n):
ls.append(''.join(zt[p]))
ret.append(ls[:])
ls.clear()
return
for m in range(n):
if zt[i][m] == 'X':
temp = copy.deepcopy(zt)
gxztt(zt, i, m)
dfs(zt, i + 1)
zt = temp
dfs(ztt, 0)
return ret
这个方法可以通过,但是空间复杂度是,看了答案,有更好的方法优化空间复杂度。
可以利用三个集合分别保存竖状态,左斜状态和右斜状态。这样可以把复杂度降到