最经典的走迷宫最短路径算法(深度优先搜索BFS的典型实例)

本文介绍了如何使用深度优先搜索(DFS)解决迷宫中最短路径问题。通过创建队列,从起点开始,遍历每个可到达的通道,更新距离并标记已访问。当找到终点时,DFS确保找到的路径是最短的。文章包含详细的解题思路和完整的代码实现。

迷宫的最短路径
问题描述
给定一个大小为N×M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四个的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。(N,M≤100)
(’#’, ‘.’ , ‘S’, 'G’分别表示墙壁、通道、起点和终点)

样例输入:
10 10

#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

样例输出:
22

变量声明:len[x][y]表示从图的起点到坐标为x,y的点的距离。
解决迷宫问题的大致思路如下:
① 从起点开始,将当前点加入队列,并设置len[start_x][start_y]为0
② 先进入一个判断队列是否为空的while循环,然后再从队列首端取出元素p(即队列中的第一个点)
③ 接着再进入一个for循环,该循环用来遍历当前点的四个移动方向是否合法,合法的我们标记该位置为已走,并且把len[该点x][该点y]=len[p.x][p.y]+1,最终在将要退出for循环前,判断该点坐标是否等于出口坐标,是则退出循环输出结果,否则就把这个当前点添加进队列,然后再进行下一次循环
④ 当四次循环都结束后(即四个方向走走遍后),转②(前提是上面的循环是正常退出的,即i==4)。否则就表示找到了出口,由于这是深度优先,是一级一级走的,故当找到终点时,当前步数一定会是最短的。

注:其实上面第3步的目的就是把每个可前进点都放进队列中,并且统计好该点的距离信息,然后对于while循环而言,下一次取出的p点就是之前走过的某个点了,你又进行下面的步骤其实就是在不断的发散该点可能的途径,就像在宽度优先搜索的图论介绍中的“分身”概念。然后这个被取出的p点不断的更换不断的发散,最后总能到达目的地(如果存在)

下面给出本题的完整代码:

在这里插入代码片#include<iostream>
#include<queue>
using namespace std;

const int MAX_X=105,MAX_Y=105;				//图的最大规格 
const int INF=1000000;						//预设一个很大的不会取到或出现的值来作为未走过的标记 
char map[MAX_X][MAX_Y];						//图 
int n,m;									//对某次而言的规格 
int start_x,start_y; 						//起始地点(入口) 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值