搜索-BFS

news2025/4/2 9:56:09

马上蓝桥杯了,最近刷了广搜,感觉挺有意思的,广搜题类型都差不多,模板也一样,大家写的时候可以直接套模板

这里给大家讲一个比较经典的广搜题-迷宫

题目问问能否走到 (n,m) 位置,假设最后一个点是我们的(n,m) 点

那我们如何判断是否可以走到我们的(n,m)点呢?

题目给我们的起点是(1,1),然后对应的数组下标就是(0,0),(下面我们说的坐标都是我们的数组下标)首先我们定义我们的一个二维数组maze来存储我们的迷宫,然后现在从(0,0)坐标开始,我们需要定义一个队列来存储我们的可用的坐标,遍历我们的坐标,然后这里我们有四个方向可以走,上下左右,就是说当我们达到该坐标的时候,需要遍历上下左右四个方向,然后将可以用的坐标进行存储到我们的队列当中

但是通过上图可以看到,当向上和向左的时候,我们的坐标越界了,没有意义,所以我们不需要处理这两个坐标,然后向右,我们发现是面墙,因为题目说" # "是一个墙,这个坐标是不能使用的,所以这里我们遍历到该坐标的时候需要一个判断看该坐标是不是" . " ,然后遍历下面,发现既没有越界,也不是墙,所以我们就将该坐标(1,0)添加到我们的队列里面,然后(0,0)坐标使用过了,我们就使用pop()方法将它删除,因为我们遍历所有可添加的坐标,使用需要将不用的坐标进行删除

通过第一次(0,0)坐标的四个方向遍历,我们已经(1,0)坐标添加上去,然后继续进行遍历~

遍历完成之后添加我们的(2,0),但是当我们遍历上面的点时,我们发现有问题,因为我们已经走过(0,0)点了,使用我们还需要一个数组dist,来储存我们走过的坐标....,如果走过,就让该坐标当下的值变成1,0表示没有走过,1表示走过,如果没有走过我们才将坐标添加上去,依次类推,直到找到我们的(n,m)点,然后进行输出,如果遍历完还没有找到,就输出No

定义:

 char maze[N][N];//迷宫
 int dist[N][N];//路径
 queue<pair<int,int> > q;//定义队列

初始化:

  memset(dist,0,sizeof(dist));
  dist[0][0]=1;//1表示走过,0表示没有走过
  q.push({0,0});//初始化队列

定义上下左右移动数组:
 

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

遍历队列坐标:(广搜模板)

    while(!q.empty()){
        auto[x,y]=q.front();
        q.pop();
        // 遍历上下左右四个方向
        for(int i=0;i<4;i++){
            int nx=x+dx[i];
            int ny=y+dy[i];
            //判断是否到达了该坐标
            if(nx==n-1&&ny==m-1){
                cout<<"Yes";
                return 0;
            }
            //判断是否可以添加该坐标
            if(nx>=0&&nx<=n&&ny>=0&&ny<=m&&maze[nx][ny]=='.'&&dist[nx][ny]==0){
                dist[nx][ny]=1;
                q.push({nx,ny});
            }
        }
    }

 

下面是代码实现:

#include<bits/stdc++.h>
using namespace std;
const int N=100;
char maze[N][N];//迷宫
int dist[N][N];//路径
queue<pair<int,int> > q;
int main(){
    int n,m;
    cin>>n>>m;
    dist[0][0]=1;//1表示走过,0表示没有走过
    q.push({0,0});//初始化队列
    memset(dist,0,sizeof(dist));
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>maze[i][j];
        }
    }
    //定义上下左右移动数组
    int dx[4]={-1,1,0,0};
    int dy[4]={0,0,-1,1};
    while(!q.empty()){
        auto[x,y]=q.front();
        q.pop();
        // 遍历上下左右四个方向
        for(int i=0;i<4;i++){
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(nx==n-1&&ny==m-1){
                cout<<"Yes";
                return 0;
            }
            if(nx>=0&&nx<=n&&ny>=0&&ny<=m&&maze[nx][ny]=='.'&&dist[nx][ny]==0){
                dist[nx][ny]=1;
                q.push({nx,ny});
            }
        }
    }
    cout<<"No";
    return 0;
}

如果大家听懂了,可以写一下P1443 马的遍历 - 洛谷  题来检测一下,一样的类型

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《边缘计算风云录:FPGA与MCU的算力之争》

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章&#xff1a;边城烽烟——数据洪流压境****第二章&#xff1a;寒铁剑匣——FPGA的千机变****第三章&#xff1a;枯木禅杖——MCU的至简道****第四章&#xff1a;双生契…

R-GCN-Modeling Relational Data with GraphConvolutional Networks(论文笔记)

CCF等级&#xff1a;B 发布时间&#xff1a;2018年6月 25年3月31日交 目录 一、简介 二、原理 1.整体 2.信息交换与更新 2.1基分解 2.2块对角矩阵 3.实体分类或链接预测 3.1实体分类 3.2链接预测 三、结论和未来工作 一、简介 RGCN通过允许不同关系类型之间的信息…

【C++初阶】----模板初阶

1.泛型函数 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础。 2.函数模板 2.1函数模板的概念 函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实参类型…

Pycharm(七):几个简单案例

一.剪刀石头布 需求&#xff1a;和电脑玩剪刀石头布游戏 考察点&#xff1a;1.随机数&#xff1b;2.判断语句 import random # numrandom.randint(1,3) # print(num) # print(**30) #1.录入玩家手势 playerint(input(请输入手势&#xff1a;&#xff08;1.剪刀 2.石头 3&…

gnvm切换node版本号

1. gnvm下载官网 GNVM - Node.js version manager on Windows by Go 2. 安装 2.1 不存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到任意文件夹&#xff0c;并将此文件夹加入到环境变量 Path。 2.2 存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到 Node.js 所在的文件夹。 2.…

PyTorch 深度学习实战(29):目标检测与 YOLOv12 实战

在上一篇文章中&#xff0c;我们探讨了对比学习与自监督表示学习。本文将深入计算机视觉的核心任务之一——目标检测&#xff0c;重点介绍最新的 YOLOv12 (You Only Look Once v12) 算法。我们将使用 PyTorch 实现 YOLOv12 模型&#xff0c;并在 COCO 数据集上进行训练和评估。…

【区块链安全 | 第五篇】DeFi概念详解

文章目录 DeFi1. DeFi 生态概览2. 去中心化交易所&#xff08;DEX&#xff09;2.1 AMM&#xff08;自动做市商&#xff09;模型2.2 订单簿模式&#xff08;现货交易&#xff09; 3. 借贷协议3.1 Aave3.2 使用闪电贷&#xff08;Flash Loan&#xff09; 4. 稳定币&#xff08;St…

【初探数据结构】归并排序与计数排序的序曲

&#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对数据结构感…

基于ruoyi快速开发平台搭建----超市仓库管理(修改记录1)

一、数据库的设计一定注意不要用关键字 数据库是同学设计的&#xff0c;但是在实践过程中&#xff0c;发现&#xff0c;生成的代码一直报错&#xff0c;结果发现数据库里面商品表里面的商品类别竟然设置成class, 注意&#xff1a;&#xff1a; class 是 Java 中的关键字&…

Springboot学习笔记3.20

目录 1.实战篇第一课 我们将会在本次实战中学习到哪些知识点&#xff1f; 开发模式和环境搭建&#xff1a; 注册接口 1.Lombok 2.开发流程 1.controller层&#xff0c;这个层会指明访问路径和要执行的逻辑&#xff1a; 2.我们把返回结果根据接口文档包装成一个类result&a…

Ubuntu和Windows实现文件互传

1.开启Ubuntu下的FTP服务&#xff1a; &#xff08;1&#xff09;终端输入&#xff1a; sudo apt-get install vsftpd&#xff08;2&#xff09;安装完成后&#xff1a; 终端输入&#xff1a; /etc 是 Linux 系统的全局配置文件目录&#xff0c;存储系统和应用程序的配置信息…

java面向对象从入门到入土

面向对象进阶 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 重点学习:学习已有对象并使用,学习如何自己设计对象并使用 设计对…

linux ACL权限控制之用户权限控制程序设计

linux中的ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种比传统UNIX权限更细粒度的权限控制机制&#xff0c;允许为文件和目录设置更为具体的用户和组权限。本文介绍使用acl命令和程序api对文件进行更精细的用户权限控制。 1. 命令行示例 使…

Java多线程与JConsole实践:从线程状态到性能优化!!!

目录 一、前言二、JConsole 使用教程二、线程的基本状态2.1新建状态&#xff08;New&#xff09;2.2就绪状态&#xff08;Ready&#xff09;2.3运行状态&#xff08;Running&#xff09;2.4 阻塞状态&#xff08;Blocked&#xff09;2.5. 等待状态&#xff08;Waiting&#xff…

Stable Diffusion vue本地api接口对接,模型切换, ai功能集成开源项目 ollama-chat-ui-vue

1.开启Stable Diffusion的api服务 编辑webui-user.bat 添加 –api 开启api服务&#xff0c;然后保存启动就可以了 2.api 文档地址 http://127.0.0.1:7860/docs3. 文生图 接口 地址 /sdapi/v1/txt2img //post 请求入参 {enable_hr: false, // 开启高清hrdenoising_stre…

第十四届蓝桥杯真题(PWM输出)

一.LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 二.按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&#xff0c;在文件夹中添加code文件夹&#…

【Qt】ffmpeg编码—存储(H264)

目录 一、编码分析 1.解码线程&#xff1a; ​编辑2.编码线程&#xff1a; ​编辑 ​编辑 二、ffmpeg编码 1.注册所有组件 2.编码初始化函数 &#xff08;2&#xff09;打开视频流 4.查找编码器 5. 写文件头信息&#xff0c;写到formatContex中 6.发送一帧数据给编码器…

Unity编辑器功能及拓展(1) —特殊的Editor文件夹

Unity中的Editor文件夹是一个具有特殊用途的目录&#xff0c;主要用于存放与编辑器扩展功能相关的脚本和资源。 一.纠缠不清的UnityEditor 我们Unity中进行游戏构建时&#xff0c;我们经常遇到关于UnityEditor相关命名空间丢失的报错&#xff0c;这时候&#xff0c;只得将报错…

REC一些操作解法

一.Linux命令长度突破 1.源码如下 <?php $param $_REQUEST[param];if ( strlen($param) < 8 ) {echo shell_exec($param); } 2.源码分析 echo执行函数&#xff0c;$_REQUEST可以接post、get、cookie传参 3.破题思路 源码中对参数长度做了限制&#xff0c;小于8位&a…

[AI绘图] ComfyUI 中自定义节点插件安装方法

ComfyUI 是一个强大的 AI 图像生成工具,支持自定义节点插件扩展其功能。本文介绍 ComfyUI 中安装自定义节点插件的三种方法,包括 Git Clone 方式、插件管理器安装方式,以及手动解压 ZIP 文件的方法,并分析它们的优缺点。 1. Git Clone 方法 使用 git clone 是最稳定且推荐…