深度优先搜索(最长路径)

深度优先搜索(dfs)

        深度优先搜索是将当前状态按你定的规则去走路,走了一步他的状态就是走了一步的状态。然后把这个新状态递归我们定的规则。如果走不下去了就后退一步,在上一个状态去找一条路去走,如果还没有就再回去一步。直到找到目标状态或者走完所有的路简而言之就是不撞南墙不回头。撞了南墙就后退一步去看看还有没有别的南墙可以走过去撞。

以下题为例题

5、编程实现,有一个nxm(1≤n,m≤100)的矩阵,且短阵中每个方格中都有一个整数(0≤
整数≤100),小蓝需要按照以下要求从短阵中找出一条最长的移动路线,且输出最长路线的
长度(1个方格为一个长度)。
要求:
小蓝可以从矩阵中任意一个方格开始向他的上下左右相邻的件意一个方格移动,且移动的路
线不能有交叉。小蓝每次所要移动的方格中的整数都要小于当前所在方格的整数(如当前所
在的方格中的整数为3,那么可以移动到数字0,1,2格子里,不能移动到数字4的格
子里)。

def find(jvzhen):
    def dfs(x,y,pre):
        if x<0 or x>=n or y<0 or y>=m or jvzhen[x][y]>=pre:
            return 0
        longest=0
        directions=[(1,0),(-1,0),(0,1),(0,-1)]
        for dx,dy in directions:
            longest=max(longest,1+dfs(x+dx,y+dy,jvzhen[x][y]))
        return longest
    n=len(jvzhen)
    m=len(jvzhen[0])
    maxpath=0

    for i in range(n):
        for j in range(m):
            maxpath=max(maxpath,dfs(i,j,float('inf')))
    return maxpath
jvzhen=[[3,2,1],
        [3,4,5],
        [2,1,3]]
result=find(jvzhen)
print("最长路径长度",result)

代码解析:

 if x<0 or x>=n or y<0 or y>=m or jvzhen[x][y]>=pre:

判断是否越界或下一个方格的数是否大于等于前一个方格的数

directions=[(1,0),(-1,0),(0,1),(0,-1)]
        for dx,dy in directions:
            longest=max(longest,1+dfs(x+dx,y+dy,jvzhen[x][y]))

在上下左右四个方向中找到最长的路径

 for i in range(n):
        for j in range(m):
            maxpath=max(maxpath,dfs(i,j,float('inf')))

为了将每个方格作为起点调用深度优先搜索的方法来找到最长的路径

ps:float('inf'):表示无穷

广度优先搜索可以用于寻找最短路径。在一般情况下,广度优先搜索相较于深度优先搜索更快地接近目标点并结束搜索,因此广度优先搜索通常用于寻找最短路径深度优先搜索则会完全探索出所有能到达目标点的路径才结束搜索,时间复杂度更高。 单源最短路径是指从一个顶点到其他所有顶点之间的最短路径。在带权有向图中,我们要找的最短路径是该路径上边的权值之和最小。广度优先搜索可以用于解决单源最短路径问题。 综上所述,广度优先搜索可以用于寻找最短路径。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [广度优先搜索BFS和深度优先搜索DFS查找最短路与最长路(C++实现)](https://blog.csdn.net/u014434494/article/details/119278607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [最短路径C++( 广度优先搜索、Dijkstra算法和Floyd算法)](https://blog.csdn.net/qq_40637903/article/details/108539144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值