信息学奥赛一本通 1448:【例题1】电路维修 | 洛谷 P4667 [BalticOI 2011 Day1] Switch the Lamp On 电路维修
【题目链接】
ybt 1448:【例题1】电路维修
洛谷 P4667 [BalticOI 2011 Day1] Switch the Lamp On 电路维修
【题目考点】
1. 双端队列广搜(0-1BFS)
【解题思路】
整个电路是由一个个的正方形的电路元件组成,每个正方形有四个角,也就是四个点。每个点作为拓扑图中的一个顶点。一共有 n ∗ m n*m n∗m个正方形,因此一共有 ( n + 1 ) ∗ ( m + 1 ) (n+1)*(m+1) (n+1)∗(m+1)个顶点,各顶点所在行号范围为0~n,列号范围为0~m。
一个顶点(sx,sy)可能直接到达的顶点为其左上、右上、右下、左下四个顶点,用0,1,2,3表示这4个方向,每个方向的下一个顶点如下:
编号 | 方向 | 该方向下一个顶点 |
---|---|---|
0 | 左上 | (sx-1, sy-1) |
1 | 右上 | (sx-1, sy+1) |
2 | 右下 | (sx+1, sy+1) |
3 | 左下 | (sx+1, sy-1) |
将各方向顶点坐标与(sx,sy)的差值保存在dir数组int dir[4][2] = {{-1, -1}, {-1, 1}, {1, 1}, {1, -1}};
,方便通过某一顶点扩展出其可以到达的顶点。
第i行第j列顶点(i,j)是第i行第j列正方形的左上角顶点。
设con数组,con[i][j][d]
表示一个(i,j)顶点在d表示的方向上是否有导线。
通过输入得到第i行第j列正方形的导线方向
- 如果为
\
,那么(i,j)的右下方向和(i+1, j+1)的左上方向有导线 - 如果为
/
,那么(i+1, j)的右上方向和(i, j+1)的左下方向有导线
设从顶点(sx,sy)在d方向扩展到的下一个顶点为(x,y),那么con[sx][sy][d]
就表示(sx, sy)到(x,y)是否有导线
- 如果从(sx, sy)到(x,y)有导线,那么说明在拓扑图中,从顶点(sx, sy)到顶点(x,y)不需要任何花费,两顶点之间有一条权值为0的边。
- 如果从(sx, sy)到(x,y)没有导线,那么需要将该正方形元件转动一次后,才能让两个顶点之间有导线相连。说明在拓扑图中,从顶点(sx, sy)到顶点(x,y)需要1单位的花费,两顶点之间有一条权值为1的边。
- 因此,该图是边权只有0、1的图。
该题求的是从左上角(0,0)到右下角(n,m)有导线通路的最小转动正方形的次数,即为拓扑图中从顶点(0,0)到顶点(n,m)的最短路径长度,可以使用双端队列广搜完成。
双端队列广搜的基本步骤为:
- 设双端队列保存状态,该问题的状态包括到达顶点位置(x, y),以及从(0,0)出发到(x,y)的路径长度dis。
- 将起始状态:【顶点(0,0),路径长度0】入队
- 每次循环出队一个状态【顶点(sx, sy),路径长度dis】,从该状态中的顶点扩展到其邻接点(一步可以走到的相邻的位置)【顶点(x, y)】,通过con数组取到从(sx, sy)到(x, y)的边的权值。
- 如果边权为1,那么新的状态【顶点(x,y),路径长度dis+1】队尾入队
- 如果边权为0,那么新的状态【顶点(x,y),路径长度dis】队头入队
- 可以增加优化:设vis数组记录已经出队的顶点,如果某一顶点已经出队,则如果该顶点再次出队,则不再扩展访问其邻接点。
因为这一次扩展得到的路径长度dis一定大于等于前一次扩展得到的路径长度dis,对于求最短路问题而言,这一次扩展到的结果一定不是最优解,没有必要仅扩展。
- 如果出队的顶点是终点,返回到达终点的最短路径长度。如果队列不断出队直至为空,也没有访问到终点,则返回-1,表示不存在从起点到终点的最短路径。
【注意】不能使用dis二维数组记录到达某个顶点的最短路径长度,因为双端队列广搜过程中,一个顶点可能会被多次扩展得到。每次扩展到该顶点时,步数可能更大也可能更小,不方便处理。
最后如果得到从起点到终点的最短路径,输出。如果得不到,输出NO SOLUTION
【题解代码】
解法1:双端队列广搜
#include <bits/stdc++.h>
using namespace std;
#define N 505
struct Path
{int x, y, dis;//存在一条到达(x, y)的长为dis的路径
};
int n, m;
int dir[4][2] = {{-1, -1}, {-1, 1}, {1, 1}, {1, -1}};//0:左上 1:右上 2:右下 3:左下
bool con[N][N][4];//con[i][j][d]:(i,j)向d方向是否有导线
bool vis[N][N];//到达(x,y)的路径是否已出队
int bfs()
{deque<Path> dq;dq.push_front(Path{0, 0, 0});while(!dq.empty()){int sx = dq.front().x, sy = dq.front().y, dis = dq.front().dis;dq.pop_front();if(vis[sx][sy])continue;vis[sx][sy] = true;if(sx == n && sy == m)return dis;for(int i = 0; i < 4; ++i){int x = sx+dir[i][0], y = sy+dir[i][1];if(x >= 0 && x <= n && y >= 0 && y <= m){if(con[sx][sy][i])//权值0 dq.push_front(Path{x, y, dis});else//权值1 dq.push_back(Path{x, y, dis+1});}}}return -1;
}
int main()
{char c;cin >> n >> m;for(int i = 0; i < n; ++i)for(int j = 0; j < m; ++j){cin >> c;if(c == '/')con[i+1][j][1] = con[i][j+1][3] = true;else//c == '\\'con[i][j][2] = con[i+1][j+1][0] = true;}int ans = bfs();if(ans == -1)cout << "NO SOLUTION";elsecout << ans;return 0;
}
相关文章:

信息学奥赛一本通 1448:【例题1】电路维修 | 洛谷 P4667 [BalticOI 2011 Day1] Switch the Lamp On 电路维修
【题目链接】 ybt 1448:【例题1】电路维修 洛谷 P4667 [BalticOI 2011 Day1] Switch the Lamp On 电路维修 【题目考点】 1. 双端队列广搜(0-1BFS) 【解题思路】 整个电路是由一个个的正方形的电路元件组成,每个正方形有四个…...

k8s删除网络组件错误
k8s集群删除calico网络组件重新部署flannel网络组件,再部署pod后出现报错不能分配ip地址 plugin type"calico" failed (add): error getting ClusterInformation: connection is unauthorized: Unauthorized 出现该问题是因为删除网络组件后,网…...

MySQL之JDBC
我们在学习完了数据库的基本操作后,希望和我们的Java程序建立连接,那么我们今天就来一探究竟JDBC是如何让Java程序与数据库建立连接的 1. 什么是JDBC JDBC(Java Data Base Connectivity, Java数据库连接) 是Java程序和数据库之间…...

音视频入门基础:MPEG2-TS专题(10)——PAT简介
一、引言 当某个transport packet的TS Header中的PID属性的值为0x0000时,该transport packet的payload为Program association table ,即 PAT表。PAT表包含所有PMT表的目录列表,将program_number和PMT表的PID相关联,获取数据的起始…...
ElementUI:el-drawer实现在父组件区域内打开抽屉组件非全屏
我们在开发ElementUI的时候遇到抽屉组件全屏的问题,但是我们需要在指定div中展示出来,上代码: 1、在el-drawer中增加属性 el-drawerstyle"position: absolute"z-index"-1":append-to-body"false">// do s…...

Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架
一、项目构建环境准备 在构建Vue项目之前,需要搭建Node环境以及Vue-CLI脚手架,由于本篇文章为上一篇文章的补充,也是为了给大家分享更为完整的搭建vue项目方式,所以环境准备部分采用Vue教程|搭建vue项目|V…...

jmeter学习(7)命令行控制
jmeter -n -t E:\IOT\test2.jmx -l E:\IOT\output\output.jtl -j E:\IOT\output\jmeter.log -e -o E:\IOT\output\report IOT下创建output 文件夹,jmx文件名避免中文,再次执行output.jtl不能有数据要删除...

BGP协议路由黑洞
一、实验环境 1、分公司与运营商AS自治系统内运行IGP路由协议OSPF、RIP或静态路由,AS自治系统内通过IBGP路由协议建立BGP邻居关系。 2、公司AS自治系统与运营商AS自治系统间运行EBGP路由协议。 3、通过loopback建立IBGP与EBGP邻居关系,发挥loopback建立…...

存储结构及关系(一)
学习目标 描述数据库的逻辑结构列出段类型及其用途列出控制块空间使用的关键字获取存储结构信息 段的类型 段是数据库中占用空间的对象。它们使用数据库数据文件中的空间。介绍不同类型的段。 表 表是在数据库中存储数据的最常用方法。表段用于存储既没有集群也没有分区的表…...

玄机应急:linux入侵排查webshell查杀日志分析
目录 第一章linux:入侵排查 1.web目录存在木马,请找到木马的密码提交 2.服务器疑似存在不死马,请找到不死马的密码提交 3.不死马是通过哪个文件生成的,请提交文件名 4.黑客留下了木马文件,请找出黑客的服务器ip提交 5.黑客留…...
python爬虫安装教程
Python爬虫是用于从网站上自动抓取信息的程序。在开始之前,请确保您了解并遵守目标网站的服务条款,尊重版权法,并且在合理合法的范围内使用爬虫技术。 安装环境 安装Python:首先确保您的计算机上已经安装了Python。推荐版本为3.…...
田忌赛马五局三胜问题matlab代码
问题描述:在可以随机选择出场顺序的情况下,如果把比赛规则从三局两胜制改为五局三胜制,齐王胜出的概率是上升了还是下降了?五局三胜的赛制下,大家的马重新分为5个等级。前提条件仍然是齐王每种等级的马都优于田忌同等级…...
Spring循环依赖问题的解决
项目启动提示如下异常: The dependencies of some of the beans in the application context form a cycle 这表明在我们的应用中存在了循环依赖,示例: Bean A 中注入了Bean B依赖,然后 Bean B 中注入了Bean A依赖。也就是说&…...

KAN-Transfomer——基于新型神经网络KAN的时间序列预测
1.数据集介绍 ETT(电变压器温度):由两个小时级数据集(ETTh)和两个 15 分钟级数据集(ETTm)组成。它们中的每一个都包含 2016 年 7 月至 2018 年 7 月的七种石油和电力变压器的负载特征。 traffic(交通) :描…...

鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)
文章目录 价值与架构定义1、价值2、架构定义 随着个人设备数量越来越多,跨多个设备间的交互将成为常态。基于传统 OS 开发跨设备交互的应用程序时,需要解决设备发现、设备认证、设备连接、数据同步等技术难题,不但开发成本高,还存…...
【k8s深入理解之 Scheme 补充-2】理解 register.go 暴露的 AddToScheme 函数
AddToScheme 函数 AddToScheme 就是为了对外暴露,方便别人调用,将当前Group组的信息注册到其 Scheme 中,以便了解该 Group 组的数据结构,用于后续处理 项目版本用途使用场景k8s.io/apiV1注册资源某一外部版本数据结构࿰…...
uni-app写的微信小程序每次换账号登录时出现缓存上一个账号数据的问题
uni-app写的微信小程序每次更换另外账号登录时出现缓存上一个账号数据的问题? 清除缓存数据:在 onShow 钩子中,我们将 powerStations、list 和 responseRoles 的值重置为初始状态,以清除之前的缓存数据。重新获取数据:…...

数据分析流程中的Lambda架构,以及数据湖基于Hadoop、Spark的实现
文章目录 一、Lambda架构1、Lambda的三层架构2、简单解释:3、Lambda架构的优缺点 二、数据湖基于Hadoop、Spark的实现1、架构2、数据管理(存储层的辅助功能) 一、Lambda架构 1、Lambda的三层架构 Batch View(批处理视图层&#…...
Android 原生解析 Json 字符串
Android 原生解析 JSON 字符串 1. JSON 基础2. Android 原生 JSON 解析方法2.1 解析 JSON 字符串到 JSONObject关键方法 2.2 解析 JSON 数组到 JSONArray关键方法 2.3 解析嵌套的 JSON 对象 3. 处理异常4. 总结 在 Android 开发中,我们经常需要从服务器获取 JSON 格…...

Windsurf可以上传图片开发UI了
背景 曾经羡慕Cursor的“画图”开发功能,这不Windsurf安排上了。 Upload Images to Cascade Cascade now supports uploading images on premium models Ask Cascade to build or tweak UI from on image upload New keybindings Keybindings to navigate betwe…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...

7种分类数据编码技术详解:从原理到实战
在数据分析和机器学习领域,分类数据(Categorical Data)的处理是一个基础但至关重要的环节。分类数据指的是由有限数量的离散值组成的数据类型,如性别(男/女)、颜色(红/绿/蓝)或产品类…...