BFS广度优先搜索详解

对于BFS的,我来谈一谈自己的理解。首先,我们从一道最基础的题来进行学习:

洛谷B3625 迷宫寻路(仔细阅读哦,我就不解释了)

B3625 迷宫寻路 - 洛谷 | 计算机科学教育新生态

对于这道题以及所有的BFS题目的核心,我们的思想是这样的:

直接暴力枚举每一种情况,并把其放入队列(因为队列符合BFS算法所需要的先进先出),在枚举完这一种情况的所有符合条件的衍生情况并入队后,把这一种情况出队,枚举下一个,也就是出队后的队首元素,直至找到符合条件的答案。又或者是说,枚举完了所有情况,都没有找到正确答案,在程序运行中体现这一点的是队列为空都没有找到答案的情况。

示例:

有一个n*m的方格,里面'#'的地方是不能走的,起点是(1,1),终点是(n,m),那么如以下图形:

.##.#
.#...
...#.

刚开始的队列(数据类型可以是pair、结构体等):

(1,1) 

想要从(1,1)走到(n,m),我们可以按刚才说的流程,把(1,1)的所有衍生坐标入队,而且入队条件为该区域不为'#'且在n*m以内。

入队后的队列:

(1,1) (2,1)

为什么只有(2,1)一个呢,这是因为对于(1,1)来说,不考虑入队条件,(1,1)确实有四种衍生情况:(0,1)(2,1)(1,2)(1,0),但其中,(0,1)(1,0)超出了n*m的范围,而(1,2)则是不能通行的'#'区域,所以最终,只有(2,1)一个符合条件的坐标被加入到了队列。可到这就完了吗?不,我们在上面说过,还需要把枚举完了所有情况的(1,1)节点出队,因为它不是答案,且没有了为答案提供价值的能力。这一点在代码里的体现不太一样,在代码中,作者是把(1,1)节点先用t保存起来,再直接出队,之后再用t代替(1,1)的作用。现在,我们就完成了一次程序将要做的枚举。之后再照着这种方式继续即可求解出答案。

全部过程展示(队列,,一行为一次枚举):

                                                                (1,1)

                                        ​​​​​​​        ​​​​​​​        ​​​​​​​        (2,1)

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        (3,1)

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        (3,2)

                                                                (3,3)

                                                                (2,3)

                                                                (2,4)

                                                                (2,5)

                                                                (2,6)

因数据太水一条路拉通

代码实现:

        对于程序实现上的补充:

       进行一次枚举时,我们需要一个标记来表示这个路段是否走过,否则,我们的程序会在两个路

       段上反复横跳。

#include<iostream>
#include<queue>
using namespace std;
int n,m;
bool temp=false;
char map[101][101];
int vis[101][101];

int dx[5]={0,0,1,-1},dy[5]={1,-1,0,0};
bool bfs(int map_x,int map_y){
    if(map_x==n&&map_y==m){
        temp=true;
    }
    if(map_x>=1&&map_x<=n&&map_y>=1&&map_y<=m){
        for(int i=0;i<4;i++){
            int xx=map_x+dx[i];
            int yy=map_y+dy[i];
            if(map[xx][yy]!='#'&&vis[xx][yy]!=1){
                vis[xx][yy]=1;
                bfs(xx,yy);
            }
        }
    }
    return temp;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>map[i][j];
        }
    }
    bool x=bfs(1,1);
    if(x){
        cout<<"Yes";
    }else{
        cout<<"No";
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948320.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java的敬老院管理系统的设计和实现【源码+文档+部署讲解】

基于Java的敬老院管理系统设计和实现 摘 要 新世纪以来,互联网与计算机技术的快速发展,我国也迈进网络化、集成化的信息大数据时代。对于大众而言,单机应用早已成为过去&#xff0c;传统模式早已满足不了当下办公生活等多种领域的需求,在一台电脑上不联网的软件少之又少&#x…

基于YOLOv8的道路缺陷检测系统

基于YOLOv8的道路缺陷检测系统 (价格80) 包含 [Block crack, Longitudinal crack, Strip repair, Transverse crack] [‘块状裂缝’&#xff0c;‘纵向裂缝’&#xff0c;‘修复’&#xff0c;‘横向裂缝’] 4个类 通过PYQT构建UI界面&#xff0c;包含图片检测&#xff…

我用AI学Android Jetpack Compose之开篇

最近突发奇想&#xff0c;想学一下Jetpack Compose&#xff0c;打算用Ai学&#xff0c;学最新的技术应该要到官网学&#xff0c;不过Compose已经出来一段时间了&#xff0c;Ai肯定学过了&#xff0c;用Ai来学&#xff0c;应该问题不大&#xff0c;学习过程记录下来&#xff0c;…

unity学习7:unity的3D项目的基本操作: 坐标系

目录 学习参考 1 unity的坐标系 1.1 左手坐标系 1.2 左手坐标系和右手坐标系的区别 1.3 坐标系的原点(0,0,0) 2 坐标系下的具体xyz坐标 2.1 position这里的具体xyz坐标值 2.2 父坐标 2.3 世界坐标和相对坐标 2.3.1 世界坐标 2.3.2 相对坐标 2.4 父物体&#xff0c;…

爬虫案例-爬取某度文档

文章目录 1、第三方库的安装和pytesseract安装2、爬取某度文档的代码3、效果图 1、第三方库的安装和pytesseract安装 #以下是安装http请求的第三方库 pip install requests #以下是安装处理文档的第三方库 pip install python-docx #以下是安装处理图片的第三方库 pip install…

在Lua中,Metatable元表如何操作?

Lua中的Metatable&#xff08;元表&#xff09;是一个强大的特性&#xff0c;它允许我们改变表&#xff08;table&#xff09;的行为。下面是对Lua中的Metatable元表的详细介绍&#xff0c;包括语法规则和示例。 1.Metatable介绍 Metatable是一个普通的Lua表&#xff0c;它用于…

【Ubuntu20.04】Apollo10.0 Docker容器部署+常见错误解决

官方参考文档【点击我】 Apollo 10.0 版本开始&#xff0c;支持本机和Docker容器两种部署方式。 如果您使用本机部署方式&#xff0c;建议使用x86_64架构的Ubuntu 22.04操作系统或者aarch64架构的Ubuntu 20.04操作系统。 如果您使用Docker容器部署方式&#xff0c;可以使用x…

springboot整合Logback

Logback介绍 描述 Logback是由log4j创始人设计的另外一种开源日志组件&#xff0c;性能比log4j要好。相对是一个可靠、通用、快速而又灵活的Java日志框架。 Logback主要分三个模块 1、logback-core&#xff1a;其他两个模块的基础模块 2、logback-classic&#xff1a;它是lo…

仓库叉车高科技安全辅助设备——AI防碰撞系统N2024G-2

在当今这个高效运作、安全第一的物流时代&#xff0c;仓库作为供应链的中心地带&#xff0c;其安全与效率直接关系到企业的命脉。 随着科技的飞速发展&#xff0c;传统叉车作业模式正逐步向智能化、安全化转型&#xff0c;而在这场技术革新中&#xff0c;AI防碰撞系统N2024G-2…

学习笔记|arduino uno r3| RGB 灯珠|Atmega328P|PWM|analogWrite|analogRead函数: RGB灯珠呼吸灯

目录 RGB 灯珠呼吸灯实验RGB 灯珠实验概述工作原理组件清单接线程序代码编译和执行 Tips&#xff1a; Arduino常用的函数解释analogWrite(pin, value)函数analogRead(pin)函数 总结 RGB 灯珠呼吸灯实验 RGB 灯珠实验概述 1-三色LED黑板模块的PCB颜色为黑色&#xff0c;使用5M…

杰发科技——使用ATCLinkTool解除读保护

0. 原因 在jlink供电电压不稳定的情况下&#xff0c;概率性出现读保护问题&#xff0c;量产时候可以通过离线烧录工具避免。代码中开了读保护&#xff0c;但是没有通过can/uart/lin/gpio控制等方式进行关闭&#xff0c;导致无法关闭读保护。杰发所有芯片都可以用本方式解除读保…

ICLR2017 | I-FGSM | 物理世界中的对抗样本

Adversarial Examples in The Physical World 摘要-Abstract引言-Introduction生成对抗图像的方法-Methods of Generating Adversarial Images对抗样本的图片-Photos of Adversarial Examples对抗图像的破坏率-Destruction Rate of Adversarial Images实验设置-Experimental Se…

MySQL(四)MySQL Select语句

1. MySQL Select语句 1.1. 基本查询语句 mysql>select 列名 from 表名;(基本结构查询某一列) mysql>select 列名1,列名2 from 表名;(查询所有列多列) mysql>select * from 表名;(*代表查询所有列) 查询时可以给列设定别名通过as 关键字&#xff0c;别名可以是汉字&a…

高并发写利器-组提交,我的Spring组件实战

高并发写优化理论 对于高并发的读QPS优化手段较多&#xff0c;最经济简单的方式是上缓存。但是对于高并发写TPS该如何提升&#xff1f;业界常用的有分库分表、异步写入等技术手段。但是分库分表对于业务的改造十分巨大&#xff0c;涉及迁移数据的麻烦工作&#xff0c;不会作为…

C++Primer 变量

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

【模型】Qwen2-VL 服务端UI

1. 前言 最近在测试VLM模型&#xff0c;发现官方的网页demo&#xff0c;代码中视频与图片分辨率可能由于高并发设置的很小&#xff0c;导致达不到预期效果&#xff0c;于是自己研究了一下&#xff0c;搞了一个简单的前端部署&#xff0c;自己在服务器部署了下UI界面&#xff0…

分布式事务介绍 Seata架构与原理+部署TC服务 示例:黑马商城

1. 什么是分布式事务? 在分布式系统中&#xff0c;如果一个业务需要多个服务合作完成&#xff0c;而且每一个服务都有事务&#xff0c;多个事务必须同时成功或失败&#xff0c;这样的事务就是分布式事务。其中的每个服务的事务就是一个分支事务。整个业务称为全局事务。 打个比…

uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器

效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…

C++Primer 基本类型

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

纯前端实现将pdf转为图片(插件pdfjs)

需求来源 预览简历功能在移动端&#xff0c;由于用了一层iframe把这个功能嵌套在了app端&#xff0c;再用一个iframe来预览&#xff0c;只有ios能看到&#xff0c;安卓就不支持&#xff0c;查了很多资料和插件&#xff0c;原理基本上都是用iframe实现的。最终转换思路&#xf…