双端队列广搜——AcWing 175. 电路维修

双端队列广搜

定义

双端队列广搜(Breadth-First Search with a Deque)是一种图或树的遍历算法变体,它利用了双端队列(Deque,全称Double Ended Queue,允许在其两端进行插入和删除操作)作为数据结构来存储待探索的节点。与传统使用队列的BFS相比,双端队列BFS能够在某些特定问题中更高效地找到最短路径,尤其是当存在多条路径长度相等且需要找到特定类型的目标节点时。

运用情况

  1. 特定目标查找:当目标具有某种特性,且希望在找到第一个满足条件的节点时立即停止搜索。
  2. 无权图的最短路径问题:当图中的边没有权重,或者所有边的权重都相同时,可以用来快速找到两个节点间的最短路径。
  3. 游戏中玩家的移动策略:例如在棋盘游戏中寻找最短的移动步数到达目标位置,尤其是在每次移动代价相同的情况下。

注意事项

  1. 初始化:确保从源节点开始,将其放入双端队列的前端。
  2. 层次遍历:为了保证层次遍历的特性,新扩展的节点应当被添加到双端队列的末端,而当前处理的节点通常从队列的前端取出。
  3. 标记已访问:避免重复访问同一个节点,对于每个访问过的节点都要做标记。
  4. 目标检测:在每次循环开始前检查双端队列前端的节点是否为目标节点,如果是,则可以提前结束搜索。
  5. 剪枝:根据具体问题,适时进行剪枝操作可以减少不必要的探索,提高效率。

解题思路

  1. 初始化:创建一个双端队列,并将起始节点入队。
  2. 循环遍历:当双端队列非空时,进行循环。
    • 出队:从队列前端取出一个节点。
    • 检查目标:如果取出的节点是目标节点,记录结果并结束循环。
    • 扩展节点:对取出节点的所有邻居进行操作,若邻居未被访问过,则标记为已访问,并根据需要将其加入队列的末端。
  3. 处理结果:如果找到了目标节点,根据题目需求输出路径或步数;如果没有找到,则输出相应的失败信息。

AcWing 175. 电路维修

题目描述

AcWing 175. 电路维修 - AcWing

运行代码

#include <cstring>
#include <iostream>
#include <algorithm>
#include <deque>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 510, M = N * N;int n, m;
char g[N][N];
int dist[N][N];
bool st[N][N];int bfs()
{memset(dist, 0x3f, sizeof dist);memset(st, 0, sizeof st);dist[0][0] = 0;deque<PII> q;q.push_back({0, 0});char cs[] = "\\/\\/";int dx[4] = {-1, -1, 1, 1}, dy[4] = {-1, 1, 1, -1};int ix[4] = {-1, -1, 0, 0}, iy[4] = {-1, 0, 0, -1};while (q.size()){PII t = q.front();q.pop_front();if (st[t.x][t.y]) continue;st[t.x][t.y] = true;for (int i = 0; i < 4; i ++ ){int a = t.x + dx[i], b = t.y + dy[i];if (a < 0 || a > n || b < 0 || b > m) continue;int ca = t.x + ix[i], cb = t.y + iy[i];int d = dist[t.x][t.y] + (g[ca][cb] != cs[i]);if (d < dist[a][b]){dist[a][b] = d;if (g[ca][cb] != cs[i]) q.push_back({a, b});else q.push_front({a, b});}}}return dist[n][m];
}int main()
{int t;cin >> t;while(t -- ){cin >> n >> m;for(int i = 0; i < n; i ++ ) cin >> g[i];int t = bfs();if(t == 0x3f3f3f3f) puts("NO SOLUTION");else cout << t << endl;}return 0;
}

代码思路

  1. 定义变量与初始化:定义了二维数组g来存储电路板状态,dist来存储从起点到各点的最小旋转次数(初始化为一个极大值),布尔数组st用于标记是否访问过某点。cs数组用于匹配当前点的电缆方向与期望方向的差异,dxdyixiy数组用于计算邻居节点坐标。

  2. 双端队列BFS:使用双端队列来存储待访问的节点,其中队首优先处理沿当前电缆方向前进的情况(无需额外旋转),队尾处理需要额外旋转的情况。这样可以保证在可能的情况下优先找到更优路径。

  3. 状态更新与路径计算:在BFS过程中,计算到达每个新节点的最小旋转次数,并根据当前点与期望方向的匹配情况决定是将新节点加入队首还是队尾。

  4. 主循环与输出:循环读取测试用例,对于每个电路板执行BFS,最后输出最小旋转次数或“NO SOLUTION”。

改进思路

  1. 内存优化:虽然原始代码已经相对高效,但是可以考虑在bfs函数内部使用局部变量代替全局变量,以减少内存占用和潜在的变量污染。

  2. 输入验证:在读取nm之前,增加对t的范围验证,确保输入合法。

  3. 代码清晰性:通过增加注释和改善变量命名,提高代码的可读性。

  4. 错误处理:在读取电路板状态时,增加输入验证,确保数据有效。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose搭建minio对象存储服务器

docker-compose搭建minio对象存储服务器 最近想使用oss对象存储进行用户图片上传的管理&#xff0c;了解了一下例如aliyun或者腾讯云的oss对象存储服务&#xff0c;但是呢涉及到对象存储以及经费有限的缘故&#xff0c;决定自己手动搭建一个oss对象存储服务器&#xff1b; 首先…

基于YOLOv10的车辆统计跟踪与车速计算应用

文章目录 1、前言2、安装运行环境3、下载v10s模型4、代码实现5、代码详读5.1、导入必要的库5.2、识别车辆5.3、读取视频文件5.4、创建视频写入器5.5、车速计算5.6、统计车辆5.7、应用跟踪5.8、视频处理 6、目标检测系列文章 1、前言 在智能交通系统&#xff08;ITS&#xff09…

FastApi中的常见请求类型

FastApi中的常见请求类型 后端开发语言中&#xff0c;我钟情于node&#xff0c;高效的异步处理真是让我眼前一亮&#xff0c;同时&#xff0c;简单易懂的语法也让我非常倾心 但是但是&#xff0c;因为考虑要写一个深度学习算法的后端接口&#xff0c;所以不得不选用python作为…

【源码+文档+调试讲解】基于vue的线上点餐系统

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了线上点餐系统的开发全过程。通过分析线上点餐系统管理的不足&#xff0c;创建了一个计算机管理线上点餐系统的方案。文章介绍了线上点餐系统的系统分析部分&…

产品经理-对产品经理的认识(1)

今天跟大家聊一下产品经理这个岗位的,产品经理是互联网岗位当中比较火的一个岗位,也是最接近CEO的岗位 产品经理岗位&#xff0c;技术门槛低&#xff0c;薪水和前景都很不错&#xff0c;又处于团队的核心位置 产品经理岗位没有完全相关的专业设置和清晰的学习路径&#xff0c;绝…

信号“地”的分类

无论是在模拟电路中还是在数字电路中都存在着个种各样的“地”。信号“地”又称参考“地”&#xff0c;就是零电位的参考点&#xff0c;也是构成电路信号回路的公共段&#xff0c;图形符号“⊥”。 (1) 数字地DGND&#xff1a;也叫逻辑地&#xff0c;是数字电路中各种开关量&a…

7.1.SQL注入-基于函数报错的方式来利用updatexml()

基于函数报错的方式来进行利用-字符型&#xff08;本页updatexml()&#xff09; 前提条件是后台数据库没有屏蔽数据库语法报错信息 updatexml()方法详解 注释&#xff1a; 第一个参数&#xff0c;意思就是xml文档的名称 第二个参数&#xff0c;意思就是定位到xml文档中指定…

C++专业面试真题(1)学习

常用Linux命令 ls&#xff1a;列出当前目录内容 ls -l&#xff1a;详细信息列表 ls -a&#xff1a;包括隐藏文件 cd&#xff1a;更改目录 pwd&#xff1a;显示当前目录路径 mkdir&#xff1a;创建新目录 rmdir&#xff1a;删除空目录 rm&#xff1a;删除文件或目录 rm -…

vision mamba-yolov8:结合Vmamba的yolov8目标检测改进实现

1.vision mamba结构与原理 Mamba成功的关键在于S6模型&#xff0c;该模型为NLP任务设计&#xff0c;通过选择性扫描空间状态序列模型&#xff0c;将二次复杂度降低至线性。但由于视觉信号&#xff08;如图像&#xff09;的无序性&#xff0c;Mamba的S6模型不能直接应用&#xf…

qt可点击的QLabel

需求——问题与思路 使用wpf实现一个可点击的超链接label相当简单&#xff08;如下图&#xff09;&#xff0c;但是qt的QLabel不会响应点击事件&#xff0c;那就从QLabel继承一个类&#xff0c;然后在该类中重写mousePressEvent函数&#xff0c;并在该函数中对左键点击事件做响…

【MySQL备份】Percona XtraBackup全量备份实战篇

目录 1. 前言 2.准备工作 2.1.环境信息 2.2.创建备份目录 2.3.配置/etc/my.cnf文件 2.4.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练&#xff1a;利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文…

如何给WPS、Word、PPT等办公三件套添加收费字体---方正仿宋GBK

1.先下载需要的字体。 下载字体的网站比较多&#xff0c;基本上都是免费的。随便在网上搜索一个就可以了&#xff0c;下面是下载的链接。 方正仿宋GBK字体免费下载和在线预览-字体天下 ​www.fonts.net.cn/font-31602268591.html 注意&#xff1a;切记不要商用&#xff0c;以免…

记一次EasyExcel的错误使用导致的频繁FullGC

记一次EasyExcel的错误使用导致的频繁FullGC 一、背景描述二、场景复现三、原因分析四、解决方案五、思考复盘 一、背景描述 繁忙的校招结束了&#xff0c;美好的大学四年也结束了&#xff0c;作者也有10个月没有更新了。拿到心仪的offer之后也开始了苦B的打工生活。 最近接到…

.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 &#xff08;1&#xff09;判断bucket是否存在 &#xff08;2&#xff09;新建bucket &#xff08…

《解答元器件的排列方式》

之前刚接触电子的时候&#xff0c;心里有个疑惑&#xff0c;为什么线路板上的电子元器件是纵横交错的排列方式&#xff0c;为什么不能是像表格一样&#xff0c;一行一列&#xff0c;整整齐齐的排列&#xff1f;为什么这个芯片必须要放在线路板的中心位置呢&#xff1f;相信不少…

【面试系列】产品经理高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

深入理解 XML 和 HTML 之间的区别

在现代网络技术的世界中&#xff0c;XML&#xff08;可扩展标记语言&#xff09;和 HTML&#xff08;超文本标记语言&#xff09; 是两个非常重要的技术。尽管它们都使用标签和属性的格式来描述数据&#xff0c;但它们在形式和用途上有显著的区别。 概述 什么是 XML&#xff…

[数据集][目标检测]睡岗检测数据集VOC+YOLO格式3290张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3316 标注数量(xml文件个数)&#xff1a;3316 标注数量(txt文件个数)&#xff1a;3316 标注…

[图解]SysML和EA建模住宅安全系统-05-参数图

1 00:00:01,140 --> 00:00:03,060 这是实数没错&#xff0c;这是分钟 2 00:00:03,750 --> 00:00:07,490 但是你在这里选&#xff0c;选不了的 3 00:00:07,500 --> 00:00:09,930 因为它这里不能够有那个 4 00:00:11,990 --> 00:00:13,850 但是我们前面这里 5 00…

Linux下编程之内存检查

前言 我们在进行编程时&#xff0c;有时不免会无意中写出一些容易导致内存问题&#xff08;可能一时表象上正常&#xff09;的代码&#xff0c;导致的后果肯定是不好的&#xff0c;就像一颗颗“哑弹”&#xff0c;令人心慌。网上推荐的辅助工具很多&#xff0c;此篇文章…