当前位置: 首页 > news >正文

蓝桥杯—走迷宫(BFS算法)

题目描述

给定一个N×M 的网格迷宫 G。G 的每个格子要么是道路,要么是障碍物(道路用 11表示,障碍物用 0 表示)。

已知迷宫的入口位置为 (x1​,y1​),出口位置为 (x2​,y2​)。问从入口走到出口,最少要走多少个格子。

输入描述

输入第 11 行包含两个正整数 N,M,分别表示迷宫的大小。

接下来输入一个 𝑁×𝑀N×M 的矩阵。若 Gi,j​=1 表示其为道路,否则表示其为障碍物。

最后一行输入四个整数 𝑥1,𝑦1,𝑥2,𝑦2表示入口的位置和出口的位置。

1≤N,M≤102,0≤Gi,j​≤1,1≤x1​,x2​≤N,1≤y1​,y2​≤M。

输出描述

输出仅一行,包含一个整数表示答案。

若无法从入口到出口,则输出 −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

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

代码为:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define  x first
#define  y second
using namespace std;
typedef pair<int,int> PII;
const int N=1e2+10;
int n,m;
int x2,y2;//出口的位置
int g[N][N];//存储地图
int dist[N][N];//每个点到起点的距离 
queue<PII> q;//存坐标
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};

int bfs(int x1,int y1)
{
  memset(dist,-1,sizeof dist);//初始都为-1
  q.push({x1,y1});
  dist[x1][y1]=0;

  while(!q.empty()){
    auto Top=q.front();//取出对头
    q.pop();//弹出对头

    for(int i=0;i<4;i++)
    {
    int a=Top.x+dx[i];
    int b=Top.y+dy[i];//入口的位置的下一个位置
    if(a<0||a>n||b<0||b>m) continue;//越界
    if(g[a][b]!=1) continue;//不是道路
   if(dist[a][b]>1) continue;
    q.push({a,b});

    dist[a][b]=dist[Top.x][Top.y]+1;

    if(a==x2&&b==y2) return dist[x2][y2];

    }
  }
 return -1;
}

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  int x1,y1;//入口的位置
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=m;j++)
    cin>>g[i][j];
  }
  cin>>x1>>y1>>x2>>y2;
  int res=bfs(x1,y1);
  cout<<res<<'\n';
  return 0;
}

优化后的代码(运行时间1ms):

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define  x first
#define  y second
using namespace std;
typedef pair<int,int> PII;
const int N=1e2+10;
int n,m;
int x2,y2;//出口的位置
int g[N][N];//存储地图
int dist[N][N];//每个点到起点的距离 
queue<PII> q;//存坐标
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};

int bfs(int x1,int y1)
{
  memset(dist,-1,sizeof dist);//初始都为-1
  q.push({x1,y1});
  dist[x1][y1]=0;

  while(!q.empty()){
    auto Top=q.front();//取出对头
    q.pop();//弹出对头

    for(int i=0;i<4;i++)
    {
    int a=Top.x+dx[i];
    int b=Top.y+dy[i];//入口的位置的下一个位置
    if(a<0||a>n||b<0||b>m) continue;//越界
    if(g[a][b]!=1) continue;//不是道路
   if(dist[a][b]>1) continue;
    q.push({a,b});

    dist[a][b]=dist[Top.x][Top.y]+1;

    if(a==x2&&b==y2) return dist[a][b];

    }
  }
 return -1;
}

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  int x1,y1;//入口的位置
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=m;j++)
    cin>>g[i][j];
  }
  cin>>x1>>y1>>x2>>y2;
  int res=bfs(x1,y1);
  cout<<res<<'\n';
  return 0;
}

http://www.dtcms.com/a/59200.html

相关文章:

  • QT | 信号与槽(超详解)
  • 控制系统分类
  • AI赋能Python零代码编程知识技能体系构架
  • 【从零开始学习计算机科学】计算机组成原理(八)输入输出设备 与 输入输出系统
  • 初学者快速入门Python爬虫 (无废话版)
  • springboot的实体类字段校验的分组校验
  • 知识图谱相关的FOAF是个啥?
  • ②Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网
  • BLUEM2引擎源码2025最新版
  • 14款粗糙边缘颗粒喷墨线条素材绘画效果Affinity笔刷画笔 Rough Raw Affinity Brushes
  • Linux搜索---locate
  • DeepSeek市场份额攀至9.6%,探索生成式AI的行业变革之路
  • 基于OpenCV的车牌识别系统(源码+论文+部署教程)
  • python fire 库与 sys.argv 处理命令行参数
  • 【前缀和与差分 C/C++】洛谷 P8218 求区间和
  • MR 3. 多组学与孟德尔随机化分析揭示动脉粥样硬化性心血管疾病的潜在治疗靶点...
  • 相机几何:从三维世界到二维图像的映射
  • AVL树
  • 【C++】6.1.1 局部对象
  • 操作系统知识点23
  • 【语料数据爬虫】Python爬虫|批量采集会议纪要数据(1)
  • Spring Cloud之注册中心之Nacos负载均衡
  • 【二】JavaScript能力提升---this对象
  • 烧结银遇上HBM:开启存储新时代
  • HTML 文本格式化
  • Docker 学习笔记:从入门到部署,实战演练全流程!
  • SpringBoot 自定义异常处理
  • 【HarmonyOS Next】鸿蒙加固方案调研和分析
  • 祝福语【算法赛】
  • ESP32驱动OV3660摄像头实现物体轮廓识别(摄像头支持红外夜视、边缘AI计算)