0、深度遍历模板(个人总结):
def dfs(arr, t):
# 满足条件
if 满足输出条件:
输出解
return
# 如果传入的条件还能继续搜下去 分析每一种情况后跟着那种情况 循环每一种情况
for i in range(len(arr)):
if 满足进一步搜索的条件:
做标记(下一步需要的状态)
dfs(arr, t+1) # 可以尽可能将状态变化写进去 ,这样就不需要对该状态回溯了
恢复标记(回溯)
1、题目
(1)题目1 输入数 n 输出 1-n的全排列
输入3
输出 123 132 213 231 321 312
def dfs11(n, k, tempstr, alllist):
# 满足条件
if k == n:
# if int(tempstr) % 2 == 0: # 如果要求值为偶数
alllist.append(tempstr) # 必须要添加它的拷贝
for i in range(1, n+1):
if str(i) not in tempstr:
dfs11(n, k+1, tempstr+str(i), alllist)
tempstr, alllist = '', []
dfs11(3,0,tempstr,alllist)
print(alllist)
(2)题目2 输入数组 nums 返回数组的全部子集
输入 [1,2,3]
输出 [[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]
# 该函数可返回 子集长度是 k 时的所有子集
def dfs2(nums, k, curk, tempset, alllist):
# 满足条件
if curk == k:
# 去alllist中的重
temp = list(tempset)
temp.sort()
if temp not in alllist:
alllist.append(temp)
# 搜索每一种可能
for i in range(len(nums)):
# 满足递归条件
if nums[i] not in tempset:
tempset.add(nums[i])
dfs2(nums, k, curk+1, tempset, alllist)
tempset.remove(nums[i])
def findsubset(nums):
alllist = [[]]
tempset = set()
for i in range(1, len(nums)+1):
dfs2(nums, i, 0, tempset, alllist)
return alllist
# print(findsubset([1,3,2]))
(3)题目3 输入数组 [1,2,3,4] 判断数组中是否有 两个数的和 等于 第三个数
输入[1,2,3,4]
输出 [[1,2,3],[1,3,4]]
def dfs3(nums, k, curk, templist, alllist, flags):
if curk == k:
templist.sort()
if sum(templist[:2]) == templist[-1] and templist not in alllist:
alllist.append(templist.copy())
return
for i in range(len(nums)):
if i not in flags: # 避免 1 1 2 这种情况 当i没有被选中时候进来
flags.append(i)
templist.append(nums[i])
dfs3(nums, k, curk+1, templist, alllist, flags)
flags.remove(i)
templist.remove(nums[i])
templist, alllist,flags = [], [],[]
dfs3([1,2,3,4,5],3,0,templist,alllist,flags)
print(alllist)