题解 | #迷宫问题#

迷宫问题

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

while True:
    try:
        m, n = list(map(int, input().split()))
        maze = []
        for _  in range(m):
            maze.append(list(map(int, input().split())))
            
        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): # 到达出口
                for p in pos:
                    print('(' + str(p[0]) + ',' + str(p[1]) + ')')
                    
        walk(0, 0)
    except:
        break
全部评论
看了半天终于理解了,刚开始的时候总在想走错的路径怎么不打印,不是已经添加到pos列表了吗?结果仔细一看才发现,代码的判断是if而不是if-else。所以,每次执行函数时,都会对四个方向进行判断,如果四个if都成立,则会产生4个pos列表,则有几个if成立,则有几个新的pos列表,函数就这样把所有的可能路线都跑了一遍。所以函数最终有两个状态,一个是满足最后的打印条件,一个是所有if都不成立,则这个pos就不会打印。又因为题目是唯一解,所以最终只会打印一个唯一正确的pos。如果是最短路径,则可以在最后一个if时,添加一个新的字典,用pos的长度作为key,pos作为value,将字典排序后打印第一个value即可。
4 回复 分享
发布于 2024-03-22 16:51 上海
补充:因为出口在最后,所以不需要return就可以结束。但有个问题是,会有两个方式到达出口,哪个最短这里怎么判断的
3 回复 分享
发布于 2022-09-19 21:07 新加坡
这代码有问题, 它会把所有可能的路径都输出一遍, 比如下面的测试用例它就有问题: 5 4 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0
2 回复 分享
发布于 2022-02-28 12:47
广度优先深度优先分不清楚吗???
1 回复 分享
发布于 2023-09-20 17:08 浙江
Why the cases were only through out 24/26? There're two cases not pass.
1 回复 分享
发布于 2023-02-25 11:01 北京
用Debug模式跑了下 这不是深度优先吗
点赞 回复 分享
发布于 2024-07-06 03:10 瑞典
假设走到(2,2),继续向右走,然后走都最后遇到死胡同,需要原路返回,为什么原路返回上的坐标不会被记录打印的?
点赞 回复 分享
发布于 2024-02-05 21:42 广东
原来是这样,如果走不通就不走了。。。有点6
点赞 回复 分享
发布于 2023-10-05 18:03 四川
我尝试将楼主右,左,下,上的的顺序改成下,右,上,左。 结果也是对的。但是在我单步调试的时候,我发现它已经走入死胡同了,但是它自己退后了几步(没有舍弃路径从新来过),然后走出了正确的路径。。。。。。。。我大为震惊:它是怎么自己退后的。。。。看不懂
点赞 回复 分享
发布于 2023-07-11 21:09 香港
太优雅了,抓住唯一解这个点,广搜一遍就出结果!牛
点赞 回复 分享
发布于 2023-01-11 20:58 四川
请问最后为什么是walk(0,0)?
点赞 回复 分享
发布于 2022-12-10 21:19 陕西
请问一下,示例2,走到list[2,3]这个位置的时候,上,右,下都是1,他是怎么倒回去的?
点赞 回复 分享
发布于 2022-11-26 11:58 四川
想请问一下如果路径走进死胡同,递归里面调用本函数发现没有一个if满足条件会怎么样?此时如何回到正确的道路上呢?
点赞 回复 分享
发布于 2022-11-23 17:01 荷兰
可以写成非递归版的吗
点赞 回复 分享
发布于 2022-09-14 17:08 广东
求大神看下我用的BFS方式哪个地方错了: n,m = map(int,input().strip().split())#获取行和列 maze1 = [] for i in range(n): maze1.append(list(map(int,input().split())))#变成int将无引号 x, y = 0, 0 step=0 start=(0,0) end=(n-1,m-1) que=[] que.append(start) #print(maze1) #获取矩阵列表 while que: step += 1 for _ in range(len(que)): now=que.pop(0) r, c = now #解包 maze1[r][c]=3 if now == end: for t in que: print(t) for rk, ck in [(r-1,c), (r+1,c), (r, c-1), (r,c+1)]: if 0 <= rk < n and 0 <= ck < m and not maze1[rk][ck]: maze1[rk][ck]=3 que.append((rk,ck))
点赞 回复 分享
发布于 2022-07-19 12:57
如果在进入下一步之前,先pos.append(next_i, next_j), 然后 walk(next_i, next_j, pos) 这样的话,pos里就记录了所有遍历过的位置,而不是正确的路径。 难道说这就是回溯的难点?
点赞 回复 分享
发布于 2022-06-13 23:32
这是递归方法 把所有可能的路径都遍历一遍 再输出对的路径
点赞 回复 分享
发布于 2022-05-21 19:54
walk(i, j+1, pos.append((i, j+1)))请教一下这个为什么不行?
点赞 回复 分享
发布于 2022-04-22 16:51
学习了! 另,若迷宫不止一条路,这种方***不会产生bug?(即生成的路径不一定为最短路径)
点赞 回复 分享
发布于 2022-02-21 21:51

相关推荐

码农索隆:这种hr,建议全中国推广
点赞 评论 收藏
分享
废物一个0offer:认真的吗二本本科找人工智能岗位
点赞 评论 收藏
分享
评论
82
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务