对于回溯法,写 backtrack 函数时,需要维护走过的「路径」和当前可以做的「选择列表」,当触发「结束条件」时,将「路径」记入结果集:
result=[]
def backtrack(路径,选择列表):
if 满足结束条件:
result.append(路径)
return
for 选择 in 选择列表:
做出选择
递归执行backtrack
撤销选择
八皇后问题
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
# 回溯法
res = []
s = '.' * n
def backtrack(path=[], i=0, col_selected=[], z_diag=set(), f_diag=set()):
if i == n:
res.append(path)
return
for j in range(n):
if j not in col_selected and i-j not in z_diag and i+j not in f_diag:
backtrack(path+[s[:j]+'Q'+s[j+1:]], i+1, col_selected+[j], z_diag|{i-j}, f_diag|{i+j})
backtrack()
return res
链接:https://leetcode-cn.com/problems/n-queens/solution/51-n-huang-hou-hui-su-suan-fa-by-jue-qia-gh95/