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

news2024/10/6 12:22:04

双端队列广搜

定义

双端队列广搜(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.coloradmin.cn/o/1885035.html

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

相关文章

CentOS7源码安装nginx并编写服务脚本

华子目录 准备下载nginx源码包关闭防火墙关闭selinux安装依赖环境 解压编译安装测试编写服务脚本&#xff0c;通过systemctl实现服务启动与关闭测试 准备 下载nginx源码包 在源码安装前&#xff0c;我们得先下载nginx源码包https://nginx.org/download/这里我下载的是nginx-1…

PHP景区旅游多商户版微信小程序系统源码

解锁景区新玩法&#xff01;​ 引言&#xff1a;一站式旅行新体验 厌倦了传统景区的单调游览&#xff1f;想要一次旅行就能体验多种风情&#xff1f;那么&#xff0c;“景区旅游多商户版”绝对是你的不二之选&#xff01;这个创新模式将景区内多个商户资源整合&#xff0c;为…

Golang-context理解

golang-context笔记整理 golang为何设计context&#xff1f;代码上理解原理空context类cancelCtx类.withcancelctx方法 timerCtx类valueCtx类 golang为何设计context&#xff1f; 有并发特性的语言中&#xff0c;都会有一种说法&#xff1a;创建异步线程或者携程的时候&#x…

【Altium】如何处理PCB上所有焊盘被误盖油

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决焊盘被误盖油的操作 2、 问题场景 所有焊盘都可以设置为盖油或不盖油&#xff0c;由于焊盘需要用来焊接元器件&#xff0c;所以都不会设置盖油。由于误操作或者创建封装时设置错误&#xff0c;造成一定数量的焊盘…

【GD32】07 - UART串口通信

GD32F407中的UART 今天我用的型号是GD32F407&#xff0c;用其他型号的小伙伴在使用UART的时候注意一下自己手上板子的资源就行&#xff0c;我们使用固件库就算是不同型号其实也是没有什么太大差别的。 我们废话不多说&#xff0c;直接开始讲怎么使用UART。 首先我们先确定串…

【面试干货】Static关键字的用法详解

【面试干货】Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;static是一个关键字&#xff0c;它可…

猫头虎博主全栈前沿AI技术领域矩阵社群

猫头虎博主全栈前沿AI技术领域矩阵社群 &#x1f44b;大家好&#xff0c;我是猫头虎&#xff01;今天我要向大家介绍一个非常重要的社群矩阵——专为全栈前沿AI技术领域的朋友们打造的各种技术交流和资源互助的社群。这些社群不仅能帮助大家快速提升技术水平&#xff0c;还能拓…

深度学习笔记: 最详尽解释混淆矩阵 Confusion Matrix

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 混淆矩阵 假设我们有包含临床测量数据的医疗数据&#xff0c;例如胸痛、良好的血液循环、动脉阻塞和体重…

LeetCode 子集

原题链接78. 子集 - 力扣&#xff08;LeetCode&#xff09; 这是一道暴力搜索问题参考大佬们的题解&#xff0c;对这类题目做出一下总结 1.确定递归参数变量 2.递归结束条件 3.做出选择&#xff0c;递归调用进入下一层 4.回溯&#xff0c;返回到递归前的状态 要完成前面这…

Golang内存分配

Go内存分配语雀笔记整理 Golang内存模型设计理念思考核心代码阅读mspanmcachemcentral中心缓存mheap分配过程 Golang内存模型设计理念思考 golang内存分配基于TCmalloc模型&#xff0c;它核心在于&#xff1a;空间换时间&#xff0c;一次缓存&#xff0c;多次复用&#xff1b;…

重大丨深中通道今通车!继港珠澳大桥后,三思再度点亮世界工程

6月30日下午3时&#xff0c;国家重大工程深中通道正式通车试运营&#xff0c;向世界再次展示中国智慧和基建实力。已承接过包括港珠澳大桥海底隧道在内2500多条隧道照明工程的上海三思电子工程有限公司&#xff0c;为这座超级工程提供了LED隧道照明、东西人工岛照明及显示、管理…

HAP官方力作:MEGA项目管理应用正式上线

开发背景 自2024年3月起&#xff0c;明道云推出了MEGA系列应用&#xff0c;基于MEGA Industrial的经营业务&#xff0c;逐步拓展至企业价值链的各个环节&#xff08;MEGA Industrial Co 是明道云预设的一家虚拟公司&#xff0c;主要面向工业制造行业客户&#xff0c;提供产线规…

node_modules/@umijs/runtime“ does not exist in container.

近日&#xff0c;在做pro ant react 项目时&#xff0c;遇到了如下这样的错误&#xff0c;开始通过vs code 的通义灵码折腾了一阵子&#xff0c;后面在csdn上一搜索&#xff0c;马上就找到答案了&#xff0c;特记录一下&#xff0c;后面再遇到这样的问题也就有迹可循了。 参考…

强对抗的 SquidLoader 针对中国企业发起攻击

研究人员近期发现了一种高对抗强度的 Loader&#xff0c;其通过钓鱼邮件附件传递给受害者。根据恶意软件所具备的引诱和规避行为&#xff0c;研究人员将其命名为 SquidLoader。SquidLoader 最早在 2024 年 4 月下旬被发现&#xff0c;但研究人员认为其至少已经活跃了一个月以上…

AE射频电源维修PE-II 10K中频电源维修

AE CESAR射频电源维修 PEII-10K镀膜电源&#xff1b;射频电源RF-5S&#xff1b;RFG3000&#xff1b;RFG3001等系列维修。 主要服务于太阳能光伏、PVD镀膜&#xff0c;半导体薄膜、离子注入、刻蚀&#xff0c;平板显示&#xff0c;光盘、光电子LED等制造工艺以及科研院校、技术研…

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域&#xff0c;目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展&#xff0c;尤其是卷积神经网络&#xff08;CNN&#xff09;的广泛应用&#xff0c;目标检测与视频轨迹追踪的性能得到…

2024年广东省食品安全管理员考试精选练习题库

76.已具有主体资格的企业申请食品流通可&#xff0c;该企业的&#xff08;&#xff09;为可申请人。 A.投资者 B.经营负责人 C.本身 答案&#xff1a;C 77.食用亚硝酸盐的销售只面向&#xff08;&#xff09;。 A.食品生产加工行业 B.餐饮业 C.食品流通单位 答案&…

Rakis: 免费基于 P2P 的去中心化的大模型

是一个开源的&#xff0c;完全在浏览器中运行的去中心化 AI 推理网络&#xff0c;用户无需服务器&#xff0c;打开即可通过点对点网络使用 Llama-3、Mistral、Gemma-2b 等最新开源模型。 你可以通过右上角的 Scale Worker &#xff0c;下载好模型后挂机就能作为节点加入到这个…

SpringSecurity6 | 基于数据库实现登录认证

SpringSecurity6 | 基于数据库认证 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 基于数据库实现登…

基于机器学习的零售商品销售数据预测系统

1 项目介绍 1.1 研究目的和意义 在电子商务日益繁荣的今天&#xff0c;精准预测商品销售数据成为商家提升运营效率、优化库存管理以及制定营销策略的关键。为此&#xff0c;开发了一个基于深度学习的商品销售数据预测系统&#xff0c;该系统利用Python编程语言与Django框架&a…