题目描述

下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可以通行的地方。

010000
000100
001001
110000

迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。

对于上面的迷宫,从入口开始,可以按 DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。

请注意在字典序中 D<L<R<U。

01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000

题解思路:

求最短路径是典型的BFS问题,可以配合队列解决。

BFS 的特点是:它是逐层扩散的(往BFS的队列中加入邻居结点时,是按距离起点远近的顺序加入的:先加入距离起点为1的邻居结点,加完之后,再加入距离为2的邻居结点,等等),搜完一层,才会继续搜下一层。一条路径是从起点开始,沿着每一层逐步往外走,每多一层,路径长度就增加了1。那么,所有长度相同的最短路径都是从相同的层次扩散出去的。当搜到第一个到达终点的最短路径后,继续搜索,会返回其他可能不是最短的路径。

打印路径的话其实在每个点上记录它的前驱结点就够了,这样从终点能一步步回溯到起点,得到一条完整路径。

from collections import deque
import math
class Point:                         def _init_(self,x=0,y=0):                       #设置节点  self.x = xself.y = ydef bfs(begin,end):max_value = math.infq = deque()flag = 0dist = [[max_value]*m for i in range(n)]        #到某个点的路径距离,初始化为最大值dist[begin.x][begin.y] = 0                      #初始化开始点pre = [[None]*m for i in range(n)]              #记录前一个节点q.append(begin)dis = [(1,0),(0,-1),(0,1),(-1,0)]               #四个方向while q:curr = q.popleft()curr_x = curr.xcurr_y = curr.yfor i in dis:tx,ty = inx,ny = curr_x + tx, curr_y + tyif nx >= 0 and nx < n and ny >=0 and ny < m and mp[nx][ny] != 1 \and dist[nx][ny] == max_value:       #如果没有越界并且没有走过dist[nx][ny] = dist[curr.x][curr.y] + 1      #路径加1pre[nx][ny] = curr                  #记录前一个节点的位置point = Point()                     point.x = nxpoint.y = nyq.append(point)if nx == end.x and ny == end.y:     #到达最终点结束flag = 1breakif flag:breakprint("最短路径: ", dist[end.x][end.y])         stack = []curr = endwhile True:                                     #使用之前记录的点不断回溯到开始点stack.append(curr)if curr.x == begin.x and curr.y == begin.y:breakpree = pre[curr.x][curr.y]curr = preedic = {0:"D", 1:"L", 2:"R", 3:"U"}              #标记上下左右四个方向while stack:if len(stack)>1:                            #当前点不是终点的时候cur = stack.pop()b = stack[-1]result = ""for i in range(len(dis)):tx,ty = dis[i]x = cur.xy = cur.yif x+tx == b.x  and y+ty == b.y:    result += dic[i]print(result,end="")            #打印每个方向else:stack.pop()n,m = map(int,input().split())
mp = [list(map(int,input())) for i in range(n)]
begin = Point()
end = Point()
begin.x = 0        #重置开始节点值
begin.y = 0
end.x = 29         #重置结束节点值
end.y = 49
bfs(begin,end)

BFS算法之迷宫的最短路径相关推荐

  1. 最短路径BFS算法matlab,迷宫的最短路径 bfs算法

    题目描述: 给定一个大小为N*M的迷宫,由通道(.)和墙壁(#)组成,其中通道S表示起点,通道G表示终点,每一次移动可以到达上下左右中不是墙壁的位置.试求出起点到终点的最小步数. 样例输入输出: 思路 ...

  2. c语言bfs算法走迷宫,使用广度优先算法(BFS)走迷宫

    前面介绍广度优先算法的时候提及了多次走迷宫,我们就真正的走一次迷宫试试! 要求如下: 输入给出迷宫矩阵的行数和列数,并给出迷宫(使用点 (.) 表示路,使用星 (*) 表示障碍物,使用S表示起点,T表 ...

  3. 详解BFS,Dijkstra算法,Floyd算法是如何解决最短路径问题的

    目录 1.BFS算法 2.Dijkstra算法 3.Floyd算法 4.总结 1.BFS算法 G纲是个物流离散中心,经常需要往各个城市运东西,怎么运送距离最近--单源最短路径问题 各个城市之间也学要来 ...

  4. 【算法】机器人走迷宫(适用于走迷宫、最短路径算法)-20200412

    标题:机器人走迷宫(适用于走迷宫.最短路径算法) 问题描述: 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵: 其中,1代表障碍,0代表可通行:示例:给定二维矩阵 0 ...

  5. 货郎担问题java算法_迷宫最短路径-货郎担问题的解决思路

    要解决的问题: 给定一个迷宫,此迷宫中有且仅有一个入口和出口,其中设有若干检查点,要求从入口开始,经过所有检查点后到达出口所需的最短路径.其中路径中允许多次经过入口或出口或某检查点,但路径的开始和结尾 ...

  6. 【算法】机器人走迷宫破壁解法(适用于走迷宫、最短路径算法)-20200412

    标题:机器人走迷宫破壁解法(适用于走迷宫.最短路径算法)-20200412 问题描述: 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵: 其中,1代表障碍,0代表可通 ...

  7. Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)

    Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS.深度优先DFS,最短路径SPF.带负权的最短路径Bellman-ford.拓扑排序) 目录 一.图的搜索 1.BFS (Brea ...

  8. (王道408考研数据结构)第六章图-第四节3:最短路径之BFS算法(思想、代码、演示、答题规范)

    文章目录 一:BFS算法基本思想 二:BFS算法代码 三:反思 最短路径shortestpath):主要有以下两类最短路径问题 单源最短路径问题:一个顶点到其他顶点最短路径 迪杰斯特拉算法(dijks ...

  9. 迷宫的最短路径(bfs)

    宽度优先搜索(BFS,Breadth-First Search)也是搜索的手段之一,与深度优先搜索类似,从某个状态出发搜索所有可以到达的状态. 与深度优先搜索的不同之处在于搜索的顺序,宽度优先搜索总是 ...

最新文章

  1. 和世界冠军一起准备ACM!清华杜瑜皓来了:连续4年ACM中国赛区冠军
  2. php 5.3 wamp,wamp php 5.3.0 升级5.3.3
  3. (转)[翻译] ASP.NET MVC Tip #1 - 使用扩展方法创建新的HTML Helper
  4. [android] 新闻客户端实现左侧导航点击切换
  5. Apache Apollo REST API
  6. java学习之(内部类)
  7. c语言入口参数和出口参数,麻烦帮忙指出一下这个函数的入口参数和出口参数呀!...
  8. 05NumPy--5.4矩阵
  9. 怎样从外网访问自己的HTTP服务器
  10. ROS外接usb摄像头标定方法
  11. Codeforces Round #750 (Div. 2)
  12. python dict嵌套dict_处理复杂嵌套dict结构的python方法
  13. vscode代码运行时间工具_今天,VS Code 五岁了。
  14. 算法设计与分析重点总结
  15. 【C/C++】LibVLC库在逐帧提取的开发中回调设置帧格式
  16. IBM SPSS Statistics教程—文件的拆分和合并
  17. python回归模型调优要运行多久_python机器学习模型参数调优
  18. 笔记本电脑突然搜索不到无线网信号怎么办?
  19. 程序员界改BUG“神”发明,学会10分钟搞定一个BUG
  20. 《甄嬛传》影评(整理)

热门文章

  1. 检测胰岛素含量,是衡量动物模型生理状态的基本指标
  2. huaweicloud华为云-云通信-语音通话对接文档整理
  3. win11系统前端IIS部署发布网站步骤
  4. 基于springboot的员工人事管理系统
  5. 长期出差补助减半,这谁还愿意出差啊
  6. 干支纪年java_天干地支纪年法 - osc_xcg0s5cw的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 如何在linux(ubuntu)下安装字体(给wps安装字体)
  8. LayaAir2.8版本新增3D粒子裁剪、预烘焙骨骼动画、视频贴图等3D功能,支持发布字节(抖音、今日头条)小游戏...
  9. 做淘客怎么引流?淘客推广技巧,淘客引流方法有哪些?
  10. 合规备案,BINANCE、WBFEX、OKEX等交易所全球领跑