BFS——广度优先探索(迷宫问题)

文章提供了一个使用BFS(广度优先搜索)算法解决从迷宫入口到出口的最短路径问题的C++实现。程序通过二维数组表示迷宫,利用队列存储和扩展路径,并通过标记避免重复访问。当找到出口时,输出步数,若无法到达出口则输出-1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BFS——广度优先探索相关视频讲解

相关讲解视频链接

题目描述

相关题目链接
给定一个 N×M 的网格迷宫 G。G 的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示)。
已知迷宫的入口位置为 (x1,y1)(x1 ,y1),出口位置为 (x2 , y2)(x2,y2)。问从入口走到出口,最少要走多少个格子。

输入描述

输入第 1 行包含两个正整数 N,M,分别表示迷宫的大小。
接下来输入一个 N×M 的矩阵。若 Gi,j=1 表示其为道路,否则表示其为障碍物。
最后一行输入四个整数 x1,y1,x2,y2,表示入口的位置和出口的位置。

在这里插入图片描述

输出描述

输出仅一行,包含一个整数表示答案。若无法从入口到出口,则输出 -1。

输入输出样例

  • 示例1:
  • 输入:
5 5 
1 0 1 1 0
1 1 0 1 1 
0 1 0 1 1
1 1 1 1 1
1 0 0 0 1
1 1 5 5 
  • 输出
8
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

//二维数组a用于存放输入的迷宫
//二维数组v用于存放标记该坐标有没有走过,没有走过是0,走过的将初始值改为1
int a[100][100]={0};
int v[100][100]={0};

//创建点在右下左上四个方向移动进行的坐标值改变(逆时针)
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};

// 创建一个结构体 记录移动点的坐标以及移动到该点所走的步数
struct point{
  int x;
  int y;
  int step;
};

// 创建一个队列 将每一个符合条件的对象压入到队列之中
queue<point> r;

int main()
{
  // 请在此输入您的代码
  int startx,starty;
  int endx,endy;
  int n,m;
  //输入迷宫的行数和列数
  cin>>n>>m;
  for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
      cin>>a[i][j];
    }
  }

  //创建一个对象
  point start;

  cin>>startx>>starty>>endx>>endy;
  start.x=startx;
  start.y=starty;
  start.step=0;

  v[startx][starty]=1;
  r.push(start);

  int flag=0;

  while(!r.empty()){
    int x=r.front().x;
    int y=r.front().y;

    if(x==endx&&y==endy){
      flag=1;
      cout<<r.front().step;
      break;
    }

    for(int k=0;k<4;k++){
      int tempx,tempy;
      tempx=r.front().x+dx[k];
      tempy=r.front().y+dy[k];

      if(a[tempx][tempy]==1&&v[tempx][tempy]==0){
        point temppoint;
        temppoint.x=tempx;
        temppoint.y=tempy;
        temppoint.step=r.front().step+1;

        r.push(temppoint);

        v[tempx][tempy]=1;
      }
    }
    r.pop();

  }
  if(flag==0){
    cout<<"-1";
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛮吉欧尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值