双向队列广搜

news2024/11/15 9:39:16

 适用情况

适用的情况:解决最短路径问题

当我们已起始点和终点时,我们可以采用双向队列广搜去解决问题。所谓的双向队列广搜,就是让起点向终点搜索,终点向起点搜索,二者同时开始,那么当它们第一次1相遇时,就是最优解

这种方法比只从起点往终点搜索,时间上更快。

实现步骤

  1. 先创建一个队列,让起点和终点都入队列,并给起点标记为:1,终点标记为:2
  2. 然后,出队头的元素,将与队头相邻的元素给入队,并给它们标记上与刚刚出队头的元素相同的标记。
  3. 当从起点开始的路和从终点开始的路第一次相遇时,此刻就是最段路径

例题

题1.离开中山路

1.1链接

P1746 离开中山路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 1.2 大体思路

前提需知: g数组里面存放着输入数据,dist[i][j]表示当前位置距离搜索的最初点的的距离

visited [ i ] [ j ]表示当前位置有没有被访问过以及被谁访问过—— -1表示没有被访问过,1表示被起点那条路径访问过,2表示被终点那条路径访问过。 (x1,y1)——表示起点,(x2,y2)——表示终点。方向数组:dx[]={0,1,0,-1},dy[]={1,0,-1,0}

  • 先让起点和终点入队列,并让它们的  dist[x1][y1]=0 , dist[x2][y2]=0  visited[ x1][y1]=1, visited [ x2 ] [ y2 ]=2
  • 然后将获取队头元素,并让它出队列,
  • 在按照方向数组去依次访问该队头元素的周围元素 ,如果越界了,则不访问;如果周围元素不是马路,则不访问;如果访问过,则不访问。
  • 当 visited[a][b] + visited[t.x][t.y] 等于 3,那么就返回 dist[a][b] + dist[t.x][t.y]+1;

 细节点:

在我们判断 visited[a][b] + visited[t.x][t.y] 是否等于3时,我们要把这个代码放在 判断周围元素是否被访问过的前面

这是因为:如果放在后面,那么当从起点开始的路径与从终点开始的路径面对面时,此刻由于是先判断是否被访问,则会造成它不会去访问周围的元素(由于周围元素都已经被访问了),直接continue了,程序就不会执行判断是否为3,就无法返回正确答案

 1.3 代码
//双向队列广搜
#include<iostream>
#include<cstring>
using namespace std;
#define x first 
#define y second

typedef pair<int,int> PII;


const int N=1010;
int n,x1,y1,x2,y2;
int g[N][N];
int dist[N][N];
int visited[N][N];
PII q[N*N];//用数组模拟队列
int hh=0,tt=1;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};

int bfs()
{
   memset(dist,-1,sizeof dist);
   memset(visited,-1,sizeof visited);
    q[0]={x1,y1},q[1]={x2,y2};
    dist[x1][y1]=0,dist[x2][y2]=0;
    visited[x1][y1]=1,visited[x2][y2]=2;
    //从起点开始搜到的,访问标为1,从终点开始搜的,访问标为2
    while(hh<=tt){
        auto t=q[hh];//取队头元素
        hh++;//删除队头元素
        for(int i=0;i<4;i++)
        {
            int a=t.x+dx[i],b=t.y+dy[i];
            if(a<1||a>n||b<1||b>n) continue;//越界排除
            if(g[a][b]==1) continue;
            
            if(visited[a][b]+visited[t.x][t.y]==3)
            {
                return dist[a][b]+dist[t.x][t.y]+1;
            }
            if(dist[a][b]>=0) continue;//被访问过排除
            q[++tt]={a,b};
            dist[a][b]=dist[t.x][t.y]+1;
            if(visited[a][b]==-1) 
             visited[a][b]=visited[t.x][t.y];
        }
    }
    

    return -1;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            char ch=getchar();
            while(ch=='\n'||ch=='\r')
            {
                ch=getchar();
            }
            g[i][j]=ch-'0';
        }
    }
    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
    int res=bfs();
    cout<<res;
}

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

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

相关文章

RocketMQ - 一条消息写入CommitLog文件之后,如何实时更新索引文件?

Broker收到一条消息之后,其实就会直接把消息写入到CommitLog里去,但是它写入刚开始仅仅是写入到MappedFile映射的一块内存里去,后续是根据刷盘策略去决定是否立即把数据从内存刷入磁盘的。 实际上,Broker启动的时候会开启一个线程,ReputMessageService,他会把CommitLog更…

FreeRTOS教程7 事件组

目录 1、准备材料 2、学习目标 3、前提知识 3.1、什么是事件组&#xff1f; 3.1、事件组特征 3.1.1、事件组、事件标志和事件位 3.1.2、EventBits_t 数据类型 3.1.3、多个任务访问 3.2、创建事件组 3.3、操作事件组 3.4、xEventGroupWaitBits() API 函数 3.4.1、ux…

主机与windows虚拟机远程桌面实现方法

目录 一、虚拟机相关配置1. 配置虚拟机网络2. 打开虚拟机远程桌面功能3. 配置虚拟机用户与分组 二、主机相关配置 当无法通过共享文件夹实现主机与windows虚拟机文件共享时&#xff0c;可以通过主机与虚拟机远程桌面的方法实现文件的共享传输。本文主要介绍主机与虚拟机远程桌面…

【接口防重复提交】⭐️基于RedisLockRegistry 分布式锁管理器实现

目录 前言 思路 实现方式 实践 1.引入相关依赖 2.aop注解 3.切面类代码 4.由于启动时报错找不到对应的RedisLockRegistry bean&#xff0c;选择通过配置类手动注入&#xff0c;配置类代码如下 测试 章末 前言 项目中有个用户根据二维码绑定身份的接口&#xff0c;由于用户在…

诺视科技完成亿元Pre-A2轮融资,加速Micro-LED微显示芯片商业化落地

近日&#xff0c;Micro-LED微显示芯片研发商诺视科技&#xff08;苏州&#xff09;有限公司&#xff08;以下简称“诺视科技”&#xff09;宣布完成亿元Pre-A2轮融资&#xff0c;本轮融资由力合资本领投&#xff0c;老股东盛景嘉成、汕韩基金以及九合创投持续加码&#xff0c;这…

YOLOv8改进 | 图像去雾 | MB-TaylorFormer改善YOLOv8高分辨率和图像去雾检测(ICCV,全网独家首发)

一、本文介绍 本文给大家带来的改进机制是图像去雾MB-TaylorFormer,其发布于2023年的国际计算机视觉会议(ICCV)上,可以算是一遍比较权威的图像去雾网络, MB-TaylorFormer是一种为图像去雾设计的多分支高效Transformer网络,它通过应用泰勒公式展开的方式来近似softmax-at…

华为openEuler系统安装openjdk并配置环境变量

华为openEuler系统安装openjdk并配置环境变量 1、安装JDK软件包 执行dnf list installed | grep jdk 查询JDK软件是否已安装。 $ dnf list installed | grep jdk查看命令打印信息&#xff0c;若打印信息中包含“jdk”&#xff0c;表示该软件已经安装了&#xff0c;则不需要再…

堆排序(向下调整法,向上调整法详解)

目录 一、 二叉树的顺序结构 二、 堆的概念及结构 三、数组存储、顺序存储的规律 此处可能会有疑问&#xff0c;左右孩子的父节点计算为什么可以归纳为一个结论了&#xff1f; 四、大小堆解释 五、大小堆的实现&#xff08;向上和向下调整法&#xff09; 5.11向上调整法…

docxTemplater——从word模板生成docx文件

官网文档&#xff1a;Get Started (Browser) | docxtemplater 官网在线演示&#xff1a;Demo of Docxtemplater with all modules active | docxtemplater 源码&#xff1a;https://github.com/open-xml-templating/docxtemplater 不仅可以处理word&#xff08;免费&#xf…

【深度学习实践】面部表情识别,深度学习分类模型,mmpretrain用于分类的实用教程,多任务网络头

文章目录 数据集数据集的进一步处理转换training.csv转换validation.csv 剔除无法使用的图片数据选择mmpretrain框架来训练配置四个文件改写base model改写base datasetsschedulesdefault_runtime 总配置开始训练训练分析考虑在网络上增加facial_landmarks回归head考虑是否可以…

论文解析:V3D: Video Diffusion Models are Effective 3DGenerators

摘要&#xff1a; 自动三维生成最近引起了广泛关注。最近的方法大大加快了生成速度&#xff0c;但由于模型容量有限或三维数据&#xff0c;生成的物体通常不够精细。在视频扩散模型最新进展的推动下&#xff0c;我们引入了 V3D&#xff0c;利用预训练视频扩散模型的世界模拟能…

【已解决】MySQL:常用的除法运算+精度处理+除数为0处理

目录 问题现象&#xff1a; 问题分析&#xff1a; 拓展&#xff1a; 1、除法运算&#xff1a; 拓展&#xff1a;MySQL中常用的几种除法运算 1、取整除法 2、浮点数除法 3、取余除法 4、向上取整除法 5、向下取整除法 2、运算结果的精度处理 1.1、浮点数 1.2、总位数 1.3、…

蓝桥杯练习题——健身大调查

在浏览器中预览 index.html 页面效果如下&#xff1a; 目标 完成 js/index.js 中的 formSubmit 函数&#xff0c;用户填写表单信息后&#xff0c;点击蓝色提交按钮&#xff0c;表单项隐藏&#xff0c;页面显示用户提交的表单信息&#xff08;在 id 为 result 的元素显示&#…

2024年敏捷产品负责人CSPO认证培训

课程名称&#xff1a;Scrum Product Owner CSPO产品负责人认证 课程类型&#xff1a;经理级 课程简介&#xff1a; Scrum Product Owner产品负责人在Scrum产品开发当中扮演“舵手”的角色&#xff0c;他决定产品的愿景、路线图以及投资回报&#xff0c;他需要回答为什么做&am…

【ZooKeeper】2、安装

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 下载zookeeper安装包 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.7.0-b…

OpenCV Steger算法提取条纹中心线

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Steger 算法是一种常用的图像边缘检测算法,可以用于提取图像中的中心线或边缘信息。它的理论假设是:条纹的亮度是按照高斯分布呈现的,即中心亮两侧渐暗。 其计算过程如下所述: 1、首先,我们需要计算每个点Hess…

汽车制造业供应商管理会面临哪些问题?要如何解决?

汽车行业的供应链是及其复杂的&#xff0c;并且呈全球化分布&#xff0c;企业在知识产权方面的优势很可能是阶段性的。企业需要持续保持领先&#xff0c;将面临巨大的挑战&#xff0c;尽快地将产品推向市场是保持领先的唯一途径。然而&#xff0c;如果没有正确的方式去实现安全…

Flutter 运行 flutter doctor 命令长时间未响应

由于 Flutter 运行 flutter doctor 命令&#xff0c;会从 pub(https://pub.dev/ 类似于 Node.js 的 npm) 上进行资源的下载&#xff0c;如果没有配置国内镜像&#xff0c;可能会由于其服务器在国外导致资源下载慢或者下载不下来&#xff0c;所以出现了运行 flutter doctor 命令…

中国银行信息系统应用架构发展历程

概述&#xff1a; 从 20 世纪 80 年代开始至今&#xff0c;我国银行业信息化历程已 有四十年历史。虽然相对于发达国家来讲&#xff0c;我国银行业务信 息化起步较晚&#xff0c;但发展速度很快&#xff0c; 目前我国一些大型商业银行的信息化程度已经处于全球领先水平。 “银行…

【IC设计】Verilog线性序列机点灯案例(四)(小梅哥课程)

文章目录 该系列目录&#xff1a;设计环境设计目标设计思路RTL及Testbench代码RTL代码Testbenchxdc约束 仿真结果 声明&#xff1a;案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔记&#xff0c;如有学习需要请支持官方正版。 该系列目录&#xff1a; Verilog线性…