目录
介绍
最短路问题是
图论
中非常经典的一种问题,其实就是通过代码找到两点之间的最优路径(往往是距离最短)
,最短路问题的解法很多,比如A*算法,迪杰斯特拉算法等等,本文介绍最短路问题中最简单的一种边权为1的最短路问题。
所谓的边权,就是指两个地点之间的距离为1
(如下图所示)
很明显,实际情况的道路更加复杂,两个地点之间的距离不能全是1,所以边权为1的最短路问题是比较特殊,简单的最短路问题
要记录整个过程的最短路,可以通过bfs来解决,选定一个地点,以这个地点为中心向外扩展(因为一个地点连接着很多的地点)
在扩散的时候来时的路是不需要再扩散回去的,所以就需要使用进行过标记。
下面是几道例题
迷宫中离入口最近的出口
例题地址:. - 力扣(LeetCode)
给你一个 m x n
的迷宫矩阵 maze
(下标从 0 开始),矩阵中有空格子(用 '.'
表示)和墙(用 '+'
表示)。同时给你迷宫的入口 entrance
,用 entrance = [entrancerow, entrancecol]
表示你一开始所在格子的行和列。
每一步操作,你可以往 上,下,左 或者 右 移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离 entrance
最近 的出口。出口 的含义是 maze
边界 上的 空格子。entrance
格子 不算 出口。
请你返回从 entrance
到最近出口的最短路径的 步数 ,如果不存在这样的路径,请你返回 -1
。
示例 1:
输入:maze = [["+","+",".","+"],[".",".",".","+"],["+","+","+","."]], entrance = [1,2] 输出:1 解释:总共有 3 个出口,分别位于 (1,0),(0,2) 和 (2,3) 。 一开始,你在入口格子 (1,2) 处。 - 你可以往左移动 2 步到达 (1,0) 。 - 你可以往上移动 1 步到达 (0,2) 。 从入口处没法到达 (2,3) 。 所以,最近的出口是 (0,2) ,距离为 1 步。
算法思路
这道题给出了起点,让求出到达终点最小的路径,也就是走了几步到达了终点,终点就是矩阵的边缘且不能在墙上走。
首先进行准备工作,定义好矩阵的边界,和遍历需要的dx,dy数组,以及标记数组。
1.在nearestExit函数中只需要调用一次bfs即可;
2.bfs函数实现:count来统计走的步数,老一套的模版了,不懂得可以看博客CSDN,不同的是,这里我们每次进行一层的遍历都需要把当前层的全部都删除,这样我们在下一层中找到合法的数据,在进行插入队列。在每次插入新的元素时千万别忘记了标记,因为走过的路是不需要再回去的。
代码实现
class Solution {
public:
int m,n;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool vis[101][101];
int nearestExit(vector<vector<char>>& maze, vector<int>& entrance)