题目
思路
回溯算法
在每一行对每个位置进行试放置,如果没有冲突,到下一行继续尝试放置,当产生冲突时尝试下一个位置,当所有行都放置好后就找到一个解
如何回溯
如果在一行中全部不合法,当前递归的for循环结束,会退到上一次递归,即是进行了一次回溯
复杂度
T
(
n
)
=
n
∗
T
(
n
−
1
)
+
O
(
n
2
)
T(n) = n*T(n-1) + O(n^2)
T(n)=n∗T(n−1)+O(n2)
迭代法可得
O
(
N
!
)
O(N!)
O(N!)
stackoverflow上的问题给出了时间复杂度,也给出了相应的分析和优化方案
代码
class Solution:
def totalNQueens(self, n: int) -> int:
self.counts = 0
columns = [-1] * n
self.backtracking(n, 0, columns)
return self.counts
def backtracking(self, n, row, columns):
# 是否在所有n行里都摆放好了皇后?
if row == n:
self.counts += 1 # 找到了新的摆放方法
return
# 尝试着将皇后放置在当前行中的每一列
for col in range(0, n):
columns[row] = col
# 检查是否合法,如果合法就继续到下一行
if self.check(row, col, columns):
self.backtracking(n, row + 1, columns)
else:
# 如果不合法,就不要把皇后放在这列中(回溯)
# 如果一行中全部都不合法,for循环结束,不会继续进入下一行,会退到上一级递归的for循环中,尝试上一行的下一个位置
columns[row] = -1
def check(self, row, col, columns):
# print(columns)
for r in range(row):
# print(r)
if columns[r] == col or row - r == abs(columns[r] - col):
return False
return True