【C++】BFS解决边权唯一的最短路径问题

目录

介绍

迷宫中离入口最近的出口

算法思路

代码实现

最小基因变化

算法思路

代码实现

单词接龙

算法思路

代码实现

为高尔夫比赛砍树

算法思路

代码实现


介绍

最短路问题是图论中非常经典的一种问题,其实就是通过代码找到两点之间的最优路径(往往是距离最短),最短路问题的解法很多,比如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)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值