⼀、全排列问题
https://leetcode-cn.com/problems/permutations/
def traverse(root:TreeNode):
for child in root.childern:
# 前序遍历需要的操作
traverse(child)
# 后序遍历需要的操作
for 选择 in 选择列表:
# 做选择
将该选择从选择列表移除
路径.add(选择)
backtrack(路径, 选择列表)
# 撤销选择
路径.remove(选择)
将该选择再加⼊选择列表
\
https://leetcode-cn.com/problems/permutations/
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
def backtrack(path=[], selects=nums):
if not selects: # 结束条件,选择列表为空
res.append(path[:])
return
for i in range(len(selects)):
path.append(selects[i]) # 做出选择
backtrack(path, selects[:i] + selects[i+1:])#后面这个索引排除了不合法的选择
path.pop() # 取消选择
backtrack()
return res
⼆、N 皇后问题
https://leetcode-cn.com/problems/n-queens/
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
board = [['.' for _ in range(n)] for _ in range(n)] #初始化棋盘:字符串在python中为不可变量,故先用list[char]表示,再用''.join()拼接
res=[] #存放最终结果
def DFS(res,row):#按行进行递归,当每一行都有一个皇后时即为满足条件返回一个结果。
#递归基:若所有行都已放好Q,把结果写入,返回
if row == n:
temp=[]
for line in board:
t = ''.join(line)
temp.append(t[:])
res.append(temp[:])
return
#对该行的每一位置进行判断,找到适合放Q的位置,再递归深入到下一行,
#到最后一行记录结果,并从下一行回溯到本行时恢复标记回溯到上行,
for col in range(len(board[row])):
if not isValid(row,col):continue#这个位置无效,判断下一个位置
#若这个位置有效
board[row][col] = 'Q'#找到位置添加标记
DFS(res,row+1)#深入到下一行搜索可能位置
board[row][col] = '.'#从下一行回溯到本行时恢复标记
DFS(res,0) #DFS搜索
return res
def isValid(row,col):#判断(row,col)是否可行
#逐行递归,判断(row,col)的每行/列/主对角/副对角是否只在(row,col)处有'Q'
#判断row行:判断[row,0:col-1]是否有'Q'
for c in range(col):#c:0->col-1
if board[row][c] == 'Q':return False
#判断col列:判断[0:row-1,col]是否有'Q'
for r in range(row):#r:0->row-1
if board[r][col] == 'Q':return False
#判断(左上角)主对角线:判断[0:row-1,0:col-1]是否有'Q'
mrow, mcol = row, col
while mrow > 0 and mcol > 0:#mrow:0->row-1,mcol:0->row-1
mrow-=1
mcol-=1
if board[mrow][mcol] == 'Q':return False
#判断(右上角)副对角线:判断[0:row-1,col+1:n]
vrow, vcol = row, col
while vrow > 0 and vcol < n-1:#vrow:0->row-1,vcol:col+1->n
vrow-=1
vcol+=1
if board[vrow][vcol] == 'Q':return False
return True
def DFS(res,row):
if row == n:
temp=[]
for line in board:
t = ''.join(line)
temp.append(t[:])
res.append(temp[:])
return True # 这里
for col in range(len(board[row])):
...
board[row][col] = 'Q'
if(DFS(res,row+1)) : return True # 这里
board[row][col] = '.'
return False # 这里
DFS(res,0)
return res