⼀、全排列问题
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[:])returnfor 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-1if board[row][c] == 'Q':return False#判断col列:判断[0:row-1,col]是否有'Q'for r in range(row):#r:0->row-1if board[r][col] == 'Q':return False#判断(左上角)主对角线:判断[0:row-1,0:col-1]是否有'Q'mrow, mcol = row, colwhile mrow > 0 and mcol > 0:#mrow:0->row-1,mcol:0->row-1mrow-=1mcol-=1if board[mrow][mcol] == 'Q':return False#判断(右上角)副对角线:判断[0:row-1,col+1:n]vrow, vcol = row, colwhile vrow > 0 and vcol < n-1:#vrow:0->row-1,vcol:col+1->nvrow-=1vcol+=1if board[vrow][vcol] == 'Q':return Falsereturn 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
三、最后总结



