python算法
一般模型:
results = [] def backtrack(路径,选择列表): pass if 路径结束,满足约束条件: results.append(路径) #保存结果 return # 注意,返回到上一个分支,而不是返回结果,退出回溯 if 路径结束,不满足约束条件: return # 注意,返回到上一个分支,而不是返回结果,退出回溯 for 选择 in 选择列表: # 更新路径和选择列表 backtrack(新的路径,新的选择列表)
例:输出1,2,3所有排序结果
nums = [1, 2, 3] res = [] # 存放组合结果 size = len(nums) def backtrack(combination,nums): # combination目前已经产生的组合,nums为剩下的数组 # 递归出口 # 递归的结束一定 要有returnif len(combination) == size: res.append(combination) return # 注意,返回到上一个分支,而不是返回结果,退出回溯 for i in range(len(nums)): backtrack(combination + [nums[i]], nums[:i] + nums[i + 1:]) # 递归回溯 return res print(backtrack([],nums))
另一种格式:

def huisu(nums): res = [] # 存放组合结果 size = len(nums) def backtrack(combination, nums): # combination目前已经产生的组合,nums为剩下的数组 # 递归出口 # 递归的结束一定 要有return if len(combination) == size: res.append(combination) return # 注意,返回到上一个分支,而不是返回结果,退出回溯 for i in range(len(nums)): backtrack(combination + [nums[i]], nums[:i] + nums[i + 1:]) # 递归回溯 backtrack([],nums) return res if __name__=="__main__": nums = [1, 2, 3] print(huisu(nums))
迷宫问题:

输入 :0表示可以通行,1表示此路不通 5 5 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0

# 最短路径 m, n = list(map(int, input().split())) maze = [] for _ in range(m): maze.append(list(map(int, input().split()))) lujin = [] # 迷宫所有路径 #函数中的每一个分支都会产生一个属于自己的pos列表,保存走这条通道的路径;且不会影响到其他分支产生的pos列表 #若是其中按其中一个分支走下去,它会在某一步不满足条件,则这个分支的pos会作废,回到上一个分支,继续 def walk(i, j, pos=[(0, 0)]): if j + 1 < n and maze[i][j + 1] == 0: # 向右 if (i, j + 1) not in pos: walk(i, j + 1, pos + [(i, j + 1)]) if j - 1 >= 0 and maze[i][j - 1] == 0: # 向左 if (i, j - 1) not in pos: walk(i, j - 1, pos + [(i, j - 1)]) if i + 1 < m and maze[i + 1][j] == 0: # 向下 if (i + 1, j) not in pos: walk(i + 1, j, pos + [(i + 1, j)]) if i - 1 >= 0 and maze[i - 1][j] == 0: # 向上 if (i - 1, j) not in pos: walk(i - 1, j, pos + [(i - 1, j)]) if (i, j) == (m - 1, n - 1): # 到达出口 lujin.append(pos) for p in pos: print('(' + str(p[0]) + ',' + str(p[1]) + ')') walk(0, 0) print(lujin) zd_lujin=lujin[0] for l in lujin: if len(zd_lujin)>len(l): zd_lujin = l print(zd_lujin) for l in zd_lujin: print(l)