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

走迷宫(BFS)

给定一个 n×mn×m 的二维整数数组,用来表示一个迷宫,数组中只包含 00 或 11,其中 00 表示可以走的路,11 表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1)(1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m)(n,m) 处,至少需要移动多少次。

数据保证 (1,1)(1,1) 处和 (n,m)(n,m) 处的数字为 00,且一定至少存在一条通路。

输入格式

第一行包含两个整数 nn 和 mm。

接下来 nn 行,每行包含 mm 个整数(00 或 11),表示完整的二维数组迷宫。

输出格式

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

数据范围

1≤n,m≤1001≤n,m≤100

输入样例:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出样例:
8
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int g[N][N];
int d[N][N];
typedef pair<int,int> PII;
int n,m;
int bfs()
{
    queue<PII> q;
    memset(d,-1,sizeof d);
    d[0][0]=0;
    q.push({0,0});
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
    while(q.size())
    {
        auto t=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int x=t.first+dx[i],y=t.second+dy[i];
            if(x>=0 && x<n && y<m && y>=0 && g[x][y]==0 && d[x][y]==-1)
            {
                d[x][y]=d[t.first][t.second]+1;
                q.push({x,y});
            }
        }
    }
    return d[n-1][m-1];
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        cin>>g[i][j];
    }
    cout<<bfs()<<endl;
    return 0;
}

 


http://www.kler.cn/a/286152.html

相关文章:

  • 详解树状数组(C/C++)
  • MicroNet关键代码解读(Micro-block与Dynamic Shift-Max的实现代码)
  • 全网最详细docker详解,从概念到实战一篇解决
  • AI在医学领域:基础模型和视觉-语言模型在计算病理学应用概述
  • 【随手记】excel中的text函数使用
  • 图片转为pdf怎么弄?简单几步:三款工具助你轻松转换!
  • Echarts:配置信息
  • 用好外呼机器人,帮助企业提升客户管理效率
  • 【Qt】工具栏
  • wordpress跨境电商外贸独立站 常见获取流量方式
  • 学习指纹浏览器 处理美团mtgsig1.2 环境检测
  • vue3+ts el-table 鼠标移动到某单元格内时就显示 tooltip
  • @antv/g6 业务场景:流程图
  • 电子邮件混淆策略逃避安全保护
  • 在 VS Code 中使用 Git 源代码管理【Mac 版】
  • 宏定义define,内联函数inline,typedef
  • 完美解决node-sass@4.14.1 postinstall: `node scripts/build.js` 问题
  • Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
  • 双臂机器人协作/合作阻抗建模及其控制实现(Dual-Arm Cooperative)
  • Vue 3 中 `async` 函数的示例