广度优先搜索(BFS)(队列实现) 走迷宫

2023-11-20

BFS应用:寻找最短路径或者遍历路径。(树,图或者更抽象的...)

实现方法:队列

为什么bfs需要队列实现? 

队列的原理是先进先出,而广度优先搜索类似于树的层次遍历,从离根节点最近的点开始向外扩散,因此用队列将最先遍历的点存入,后遍历的点后存入,符合bfs的逻辑。

经典例题:走迷宫

学习中遇到的几个问题:

1,如何表示迷宫走的方向?——通过向量表示,dx,dy一一对应;

 分别是四个方向:向上/下/左/右;

    int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};

2, 如何确保最后返回的一定是最短路径?———因为bfs是广度优先搜索,一定是从最近的点开始向外扩散,在bfs中,因为最短路径一定是第一个搜到的,所以最先搜到的距离即为最短路径。

3,while(q.size())是什么意思?——即判断队列内是否为空。为空说明迷宫所表示的图已经遍历完全,那么就可以返回最右下点的距离了。

 

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

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

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

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

输入格式

第一行包含两个整数 n 和 m。

接下来 n 行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。

输出格式

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

数据范围

1≤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 <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int,int> PII;
const int N=110;
queue<PII>q;
int d[N][N],g[N][N];
int m,n;
int bfs()
{
    memset(d,-1,sizeof d);
    d[0][0]=0;
    q.push({0,0});
    int dx[4]={1,-1,0,0},dy[4]={0,0,1,-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>=0&&y<m&&d[x][y]==-1&&g[x][y]==0)
            {
                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();
    return 0;
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

广度优先搜索(BFS)(队列实现) 走迷宫 的相关文章

随机推荐

  • 【深度学习与计算机视觉】2、线性 SVM 与 Softmax 分类器

    文章目录 2 线性SVM与Softmax分类器 2 1 得分函数 score function 2 1 1 线性分类器 2 1 2 理解线性分类器 2 2 损失函数 2 2 1 多类别支持向量机损失 Multiclass SVM loss
  • 一道文件上传题checkln

    这是一道文件上传题 做起来感到毫无头绪 看来提示 user ini 才知道怎么回事 user ini究竟是个什么东东 自 PHP 5 3 0 起 PHP 支持基于每个目录的 htaccess 风格的 INI 文件 此类文件仅被 CGI Fa
  • 计算机视觉parsing_parsenet.pth文件下载

    计算机视觉parsing parsenet pth文件下载 链接 https pan baidu com s 1gW3gLZ cPNHPawe0U5299w pwd ufd0 提取码 ufd0
  • vue打包后不使用服务器直接访问方法

    根据官网打包执行npm run build 后dist文件夹打开的index html 是空白 需要开启http服务器才能访问 以下是解决办法 1 找到config文件夹下的index文件 修改成 2 找到build文件夹下的until文件
  • 绝!OpenAI 年底上新,单卡 1 分钟生成 3D 点云,text-to 3D 告别高算力消耗时代

    内容一览 继 DALL E ChatGPT 之后 OpenAI 再发力 于近日发布 Point E 可以依据文本提示直接生成 3D 点云 关键词 OpenAI 3D 点云 Point E OpenAI 年底冲业绩 半个多月前发布的 Chat
  • 20篇必读论文!2023世界人工智能大会青年优秀论文奖公示

    2023年2月 关于推荐 2023世界人工智能大会青年优秀论文奖 参评论文的通知 发布 面向全球高校 科研院所 企业开展人工智能领域青年优秀论文征集活动 至征稿截止 共收到海内外参评论文235篇 包括国际相关知名高校 科研机构 企业 经初评
  • Postfix 554 5.7.1 Relay Access Denied

    D678453B4C672EB0 716 entry Postfix 554 5 7 1 Relay Access DeniedPostfix 安装后想在 Windows 或者 Linux 用邮件程序 Outlook或者Evolution等
  • 结构体排序问题

    题目如下 刚刚看到这道题的时候一点点思路都没有 连题目都没读懂 include
  • 非阻塞connect问题

    在发起一个网络连接时 如果不知道服务器是否正常 我们经常会阻塞在connect 在 linux网络编程 一书中讲述了使用select 实现非阻塞connect的方法 基本步骤如下 1 创建 socket 返回套接字描述符 2 调用 fcnt
  • vue pc端 输入验证码_云顶之奕手游国际服拳头riot账号注册验证码怎么点,出错解决方法...

    首先上图看下这个烦人的验证码 云顶之弈手游验证码 是不是点了N遍也点不对 今天我来告诉你怎么点 学会之后估计还是很难点对 其实 操作很简单 见上图 1 查看提示物 斑马线 消防栓 小汽车 公交车 山 树 烟囱等 2 点选对应图片 可能点完之
  • dataframe 使用拉格朗日插值填充缺失值

    本例中代码使用 jupyter 运行 问题场景 在处理dataframe时 可能会遇到少量数据缺失的情况 在连续缺失数据较少的情况可以考虑插值填充 本文调用了scipy库的lagrange x y 这个函数 参数x y分别是对应各个点的x值
  • Java 简单修饰符补充学习笔记(基础)

    前言 顾名思义 这里是补充修饰符的学习笔记 通配符 顾名思义即可 const 常变量修饰符 首先const是constant 恒定不变的 的缩写 const 就是描述变量为常量的修饰符 关键字 或者说 const 是定义常变量的关键字 用
  • Screen 对象

    解释 Screen 对象包含有关客户端显示屏幕的信息 Screen 对象属性 属性 说明 availHeight 返回屏幕的高度 不包括Windows任务栏 availWidth 返回屏幕的宽度 不包括Windows任务栏 colorDep
  • Docker容器网络

    一 虚拟化网络 Docker 镜像启动容器 默认Docker 容器可以直接访问互联网 前提 宿主机能够上外网 Docker 容器的IP 专属IP段 默认跟宿主机不在同网段 Docker Engine 引擎服务 默认会在宿主机创建网卡 命名
  • MVC模型图

    MVC图
  • 【联想RQ940】联想RQ940更换主板电池+重新设置BIOS

    RQ940服务器告警灯闪烁 连接管理口查看日志 判断问题为主板纽扣电池电压低 纽扣电池型号为CR2032 停业务 关机 下架 拆机 电池位于图片所示位置 可以先将左边RAID卡拆下来 方便更换电池 2 重新设置BIOS 更换电池后 由于BI
  • SpringBoot 微服务 详解

    1 注入 1 1 Bean对象管理 Spring Boot 由于没有XML文件 所以所有的Bean管理都放入在一个配置类中实现 配置类就是类上具有 Configuration的类 这个类就相当于之前的applicationContext x
  • 计算机竞赛 基于CNN实现谣言检测 - python 深度学习 机器学习

    文章目录 1 前言 1 1 背景 2 数据集 3 实现过程 4 CNN网络实现 5 模型训练部分 6 模型评估 7 预测结果 8 最后 1 前言 优质竞赛项目系列 今天要分享的是 基于CNN实现谣言检测 该项目较为新颖 适合作为竞赛课题方向
  • bilibili的评论ip属地显示未知

    现象 出于某些原因 我们在日常使用中的大部分平台都开启了IP地址显示 一般会显示当事人所在的地址 这其中就有一些奇怪的地址 在此不谈魔法 就比如我最近在刷B站的时候 就在评论区发现了一些显示 未知 的ip 而只要点进他们的主页还是会发现他们
  • 广度优先搜索(BFS)(队列实现) 走迷宫

    BFS应用 寻找最短路径或者遍历路径 树 图或者更抽象的 实现方法 队列 为什么bfs需要队列实现 队列的原理是先进先出 而广度优先搜索类似于树的层次遍历 从离根节点最近的点开始向外扩散 因此用队列将最先遍历的点存入 后遍历的点后存入 符合