欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 算法刷题笔记 广度优先搜索(BFS)走迷宫(C++实现)

算法刷题笔记 广度优先搜索(BFS)走迷宫(C++实现)

2026/6/2 0:56:14 来源:https://blog.csdn.net/hanmo22357/article/details/140530234  浏览:    关键词:算法刷题笔记 广度优先搜索(BFS)走迷宫(C++实现)

文章目录

    • 题目描述
    • 基本思路
    • 实现代码

题目描述

  • 给定一个n×m的二维整数数组,用来表示一个迷宫,数组中只包含01,其中0表示可以走的路,1表示不可通过的墙壁。
  • 最初,有一个人位于左上角(1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
  • 请问,该人从左上角移动至右下角(n,m)处,至少需要移动多少次。
  • 数据保证(1,1)处和(n,m)处的数字为0,且一定至少存在一条通路。

输入格式

  • 第一行包含两个整数nm
  • 接下来n行,每行包含m个整数(01),表示完整的二维数组迷宫。

输出格式

  • 输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围

  • 1 ≤ n,m ≤ 100

基本思路

  • 本题的基本思路是基于广度优先搜索算法(BFS)来进行求解,因为广度优先搜索算法的一大优势就是可以找出最短路径。
  • 广度优先算法的基本思想是:找到当前所在位置的所有位置,在遍历完当前所在位置后,遍历与该位置相邻的所有位置;接着,找到每一个与该位置相邻的所有位置,遍历与这些位置相邻的没有被遍历过的位置,重复这个过程,直到完成遍历。
  • 广度优先搜索的代码实现有一个常用的框架,是基于队列的,因此可以直接使用C++的STL中自带的queue数据结构模板即可。

实现代码

#include <cstdio>
#include <queue>
using namespace std;// n和m分别表示迷宫的长度和宽度
int n, m;
// 分别使用一个二维数组表示迷宫本身以及从起点到当前点的最短距离
const int N = 110;
int maze[N][N];
int distances[N][N];
// 用一个结构体表示当前位置
struct coordinate
{int x;int y;
};// 用于在迷宫中找到从起点到终点的最短路径的函数
int shortest_path(int n, int m)
{// 构建一个队列,并将起始状态放入该队列中queue<coordinate> coordinates;coordinates.push({1,1});distances[1][1] = 0;maze[1][1] = 2;// 每次从队首取出一个位置,找到该位置四周还没有遍历过的位置,放入队列中while(coordinates.empty() == false){// 取出队首元素coordinate current = coordinates.front();coordinates.pop();// 向左走的情况,走过的地方设置为2,下面同理if(current.y - 1 >= 1 && maze[current.x][current.y - 1] == 0){distances[current.x][current.y - 1] = distances[current.x][current.y] + 1;maze[current.x][current.y - 1] = 2;coordinates.push({current.x, current.y - 1});}// 向右走的情况if(current.y + 1 <= m && maze[current.x][current.y + 1] == 0){distances[current.x][current.y + 1] = distances[current.x][current.y] + 1;maze[current.x][current.y + 1] = 2;coordinates.push({current.x, current.y + 1});}// 向上走的情况if(current.x - 1 >= 1 && maze[current.x - 1][current.y] == 0){distances[current.x - 1][current.y] = distances[current.x][current.y] + 1;maze[current.x - 1][current.y] = 2;coordinates.push({current.x - 1, current.y});}// 向下走的情况if(current.x + 1 <= n && maze[current.x + 1][current.y] == 0){distances[current.x + 1][current.y] = distances[current.x][current.y] + 1;maze[current.x + 1][current.y] = 2;coordinates.push({current.x + 1, current.y});}}// 将右下角的距离返回return distances[n][m];
}int main(void)
{// 输入部分,需要注意该迷宫的下标从1开始scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++ i) for(int j = 1; j <= m; ++ j) scanf("%d", &maze[i][j]);// 输出部分printf("%d", shortest_path(n, m));return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词