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))
View Code

迷宫问题:

输入 :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
View Code
# 最短路径
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)
View Code

 

posted @ 2023-12-10 12:34  咿呀鲸落  阅读(23)  评论(0)    收藏  举报