题解 | dfs深度优先python3 解决经典#迷宫问题#

迷宫问题

http://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

最近突击学习了一下dfs,代码按dfs模板写完,突然就跑出正确答案了。中间的递归思想感觉自己还是没学清楚。不过看了下其他题解,有很多写法没有运用到dfs的核心思想,好多还要判断上下左右有没有墙,然后再决定往哪个方向走(这一步应该交给代码自己遍历。本题可以参考leetcode 200 岛屿数量https://leetcode-cn.com/problems/number-of-islands/.

用深度优先,代码自己可以跑完所有含‘0’的路径,重点是如何返回到达goal的路径,并记录每次坐标。我们可以标记走过的map[x][y]=1,表示这个点已经访问了(建个墙,类似于leetcode200中“冲岛”处理)。这样操作后,当代码探索其中某一条路径时候不会走“回头路”(否则,会围着点不断打转)。同时将该点添加到路径route中。

然后应用回溯递归的思想,如果我们无法到达指定终点,则需要沿原路返回,再把标记过的路去掉 map[x][y]=0,route.pop(), 直到到达当初的分岔路口,进入下一次选择(这个过程有点像stack里的pop())。

如何知道该点是否到达goal呢?如果某个点,四周都是1(无法访问)说明“这条路”到头了,如果这个点坐标并不等于goal,那么返回 return,递归开始回退,沿“原路”返回,直到最近的一个分岔口,进入到另个方向的探索。

否则在刚进入 dfs 函数时就会在第一步的判断中打印出 route并且停止函数运行。

DFS搜索的本质就是递归回溯!!!

alt


def dfs(i,j):
    dx = [0,0,-1,1]
    dy = [-1,1,0,0]
    if i == m-1 and j == n-1:
        for pos in route:
            print('('+str(pos[0])+','+str(pos[1])+')')
        return
    
    for k in range(4):
        x = i+dx[k]
        y = j+dy[k]
        if x>=0 and x<m and y>=0 and y<n and map1[x][y]==0:
            map1[x][y]=1
            route.append((x,y))
            dfs(x,y)
            map1[x][y]=0
            route.pop()
    else:
        return
            

while True:
    try:
        m,n = list(map(int,input().split()))
        map1=[]
        for i in range(m):
            s=list(map(int,input().split()))
            map1.append(s)
		// 初始值是(0,0)将其标记为已经访问
        route = [(0,0)]
        map1[0][0]=1
        dfs(0, 0)
        
    except:
        break
全部评论
为什么这个可以保证一定是最短路径呢?假设map中有一块空地,比如[[0, 0], [0, 0]],如果代码在空地中绕一圈然后再出去,同样到达了终点然后输出了路径,但此时不是最优路径,程序到这边就结束了,没法对于路径是否最优作出二次判断,有没有大佬可以解释一下。
2 回复 分享
发布于 2023-08-09 12:16 江苏
为什么第16行还要把map1[x][y]改成0啊
1 回复 分享
发布于 2022-05-01 12:59
第18行有加else:的必要吗
点赞 回复 分享
发布于 2022-04-17 16:27
优秀
点赞 回复 分享
发布于 2022-06-07 21:47
请问下dx和dy是啥意思呀
点赞 回复 分享
发布于 2022-10-21 10:46 广东
这个牛
点赞 回复 分享
发布于 2023-05-20 23:29 陕西
dfs()里面为什么可以不用route参数,虽然def(x,y,route)也是正确的
点赞 回复 分享
发布于 2023-06-19 16:08 上海
这代码不管怎么样最后调用完都会把矩阵恢复原样、路线清空吧
点赞 回复 分享
发布于 2023-10-05 18:12 四川

相关推荐

无敌虾孝子:喜欢爸爸还是喜欢妈妈
点赞 评论 收藏
分享
球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
55 36 评论
分享
牛客网
牛客企业服务