BFS解决迷宫最短路径(Python)
- 1、概述
- 2、算法的逻辑
- 3、代码解析
- 4、代码编写过程遇到错误
1、概述 第一次写文章,题材选了最近刚上手的BFS算法,博客上介绍这类算法文章很多,有很多简洁快速的算法,我采用知识普通的一种方法。我主要想分享一下在代码编写过程遇到的错误,希望能给大家一些借鉴。
2、算法的逻辑 在我刚开始想解决迷宫问题时,阅读大量代码,试图快速学习掌握这个算法(我是一新手),不但没看懂反而让我更着急,后来看了一些讲解视频,体会想要掌握新的算法,首先需要先了解这种算法的逻辑,以图表及文字形式先预演一次算法运行的过程,在这个过程中能够加深对算法原理的认识,做到心中有数。了解算法逻辑后可以开始写代码了。
介绍BFS解决迷宫问题思路是从起点出发,记录每走一步能够到达的点,并判断最新到达的点是否是终点,如果是终点则停止搜索,否者继续往下走一步。这里有两个问题要解决,先要解决任一点走一步能够到的点,创建一列表用来存储起点及潜在终点(对于每个点有上下左右四种走法,如果能够到达的点不超范围,不是墙壁并且未走过,则认为是潜在终点)。其次解决另外一个问题,完成一个点的搜索之后,将搜索下一个加入列表中的点,循环直到潜在终点就是终点。
3、代码解析 代码分为三个部分,Part 1是从一个Txt中导入迷宫的二维矩阵图,如下所示,并求取矩阵的行列值
0 0 1 1 0
0 0 0 1 0
1 1 0 0 0
1 0 1 1 0
0 0 0 0 0
1 0 1 1 0
Part 2 是建立五个列表,Dir存储每个点运行方位,x,y及s存储搜索过程中每个点x坐标,y坐标及步数,idx存储已经遍历过的点的数量。
Part 3 是代码主题部分,循环判断潜在终点是否是终点,如果是则停止循环。
#Part 1
f = open('Migong.txt','r')
Mg = []
for line in f:
li = list(map(int,line.split()))
Mg.append(li)
a =len(Mg)
b = len(Mg[0])
#Part 2
Dir = [[-1,0],[0,1],[1,0],[0,-1]]
x = []
y = []
s = []
idx = []
Vis = [[0 for i in range(b)]for i in range(a)]
x.append(0)
y.append(0)
s.append(0)
Vis[0][0] = 1
step = 0
index = 0
#Part 3
while (x[index] + y[index] < a+b-2):
for i in range(4):
Nx = x[index] + Dir[i][0]
Ny = y[index] + Dir[i][1]
if Nx < 0 or Nx > a-1 or Ny<0 or Ny>b-1:
continue
if Mg[Nx][Ny] == 1 or Vis[Nx][Ny] == 1:
continue
x.append(Nx)
y.append(Ny)
s.append(step+1)
Vis[Nx][Ny] = 1
idx.append(index) #记录遍历过的每一个点
index +=1
step = s[index]
print(s[-1])
4、代码编写过程遇到错误 【python|BFS解决迷宫最短路径】代码编写过程花费最多时间是记录达到每个潜在终点的及当前正在遍历的点的之间关系。到达每个潜在终点的总步数是正在遍历的点步数+1,理解好这一点就能够顺利完成这个算法啦!
第一次写文章,如有写的不好地方,欢迎指正!
推荐阅读
- leetcode刷题|???算法——搜索(最短路径BFS与DFS)
- Leet|单源点求最短路径的三种常用的方法
- 图论|BFS最短路径的两种打印方法
- java|Go 1.18 二进制文件的信息嵌入
- python|一文看懂 Go 泛型核心设计
- centos7 pip 8.x.x 版本升级失败
- Programming Puzzle: Bamboo Trimming
- Java基础案例|Java基础案例 | 第二弹(持续更新...xdm冲啊)
- Java基础案例|Java案例 | 学籍管理系统(超详解 )