当前位置: 首页 > news >正文

信息学奥赛一本通 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 nm个正方形,因此一共有 ( 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)的最短路径长度,可以使用双端队列广搜完成。

双端队列广搜的基本步骤为:

  1. 设双端队列保存状态,该问题的状态包括到达顶点位置(x, y),以及从(0,0)出发到(x,y)的路径长度dis。
  2. 将起始状态:【顶点(0,0),路径长度0】入队
  3. 每次循环出队一个状态【顶点(sx, sy),路径长度dis】,从该状态中的顶点扩展到其邻接点(一步可以走到的相邻的位置)【顶点(x, y)】,通过con数组取到从(sx, sy)到(x, y)的边的权值。
    • 如果边权为1,那么新的状态【顶点(x,y),路径长度dis+1】队尾入队
    • 如果边权为0,那么新的状态【顶点(x,y),路径长度dis】队头入队
  4. 可以增加优化:设vis数组记录已经出队的顶点,如果某一顶点已经出队,则如果该顶点再次出队,则不再扩展访问其邻接点。

    因为这一次扩展得到的路径长度dis一定大于等于前一次扩展得到的路径长度dis,对于求最短路问题而言,这一次扩展到的结果一定不是最优解,没有必要仅扩展。

  5. 如果出队的顶点是终点,返回到达终点的最短路径长度。如果队列不断出队直至为空,也没有访问到终点,则返回-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&#xff1a;【例题1】电路维修 洛谷 P4667 [BalticOI 2011 Day1] Switch the Lamp On 电路维修 【题目考点】 1. 双端队列广搜&#xff08;0-1BFS&#xff09; 【解题思路】 整个电路是由一个个的正方形的电路元件组成&#xff0c;每个正方形有四个…...

k8s删除网络组件错误

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

MySQL之JDBC

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

音视频入门基础:MPEG2-TS专题(10)——PAT简介

一、引言 当某个transport packet的TS Header中的PID属性的值为0x0000时&#xff0c;该transport packet的payload为Program association table &#xff0c;即 PAT表。PAT表包含所有PMT表的目录列表&#xff0c;将program_number和PMT表的PID相关联&#xff0c;获取数据的起始…...

ElementUI:el-drawer实现在父组件区域内打开抽屉组件非全屏

我们在开发ElementUI的时候遇到抽屉组件全屏的问题&#xff0c;但是我们需要在指定div中展示出来&#xff0c;上代码&#xff1a; 1、在el-drawer中增加属性 el-drawerstyle"position: absolute"z-index"-1":append-to-body"false">// do s…...

Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架

一、项目构建环境准备 在构建Vue项目之前&#xff0c;需要搭建Node环境以及Vue-CLI脚手架&#xff0c;由于本篇文章为上一篇文章的补充&#xff0c;也是为了给大家分享更为完整的搭建vue项目方式&#xff0c;所以环境准备部分采用Vue教程&#xff5c;搭建vue项目&#xff5c;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 文件夹&#xff0c;jmx文件名避免中文&#xff0c;再次执行output.jtl不能有数据要删除...

BGP协议路由黑洞

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

存储结构及关系(一)

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

玄机应急:linux入侵排查webshell查杀日志分析

目录 第一章linux:入侵排查 1.web目录存在木马&#xff0c;请找到木马的密码提交 2.服务器疑似存在不死马&#xff0c;请找到不死马的密码提交 3.不死马是通过哪个文件生成的&#xff0c;请提交文件名 4.黑客留下了木马文件&#xff0c;请找出黑客的服务器ip提交 5.黑客留…...

python爬虫安装教程

Python爬虫是用于从网站上自动抓取信息的程序。在开始之前&#xff0c;请确保您了解并遵守目标网站的服务条款&#xff0c;尊重版权法&#xff0c;并且在合理合法的范围内使用爬虫技术。 安装环境 安装Python&#xff1a;首先确保您的计算机上已经安装了Python。推荐版本为3.…...

田忌赛马五局三胜问题matlab代码

问题描述&#xff1a;在可以随机选择出场顺序的情况下&#xff0c;如果把比赛规则从三局两胜制改为五局三胜制&#xff0c;齐王胜出的概率是上升了还是下降了&#xff1f;五局三胜的赛制下&#xff0c;大家的马重新分为5个等级。前提条件仍然是齐王每种等级的马都优于田忌同等级…...

Spring循环依赖问题的解决

项目启动提示如下异常&#xff1a; The dependencies of some of the beans in the application context form a cycle 这表明在我们的应用中存在了循环依赖&#xff0c;示例&#xff1a; Bean A 中注入了Bean B依赖&#xff0c;然后 Bean B 中注入了Bean A依赖。也就是说&…...

KAN-Transfomer——基于新型神经网络KAN的时间序列预测

1.数据集介绍 ETT(电变压器温度)&#xff1a;由两个小时级数据集&#xff08;ETTh&#xff09;和两个 15 分钟级数据集&#xff08;ETTm&#xff09;组成。它们中的每一个都包含 2016 年 7 月至 2018 年 7 月的七种石油和电力变压器的负载特征。 traffic(交通) &#xff1a;描…...

鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)

文章目录 价值与架构定义1、价值2、架构定义 随着个人设备数量越来越多&#xff0c;跨多个设备间的交互将成为常态。基于传统 OS 开发跨设备交互的应用程序时&#xff0c;需要解决设备发现、设备认证、设备连接、数据同步等技术难题&#xff0c;不但开发成本高&#xff0c;还存…...

【k8s深入理解之 Scheme 补充-2】理解 register.go 暴露的 AddToScheme 函数

AddToScheme 函数 AddToScheme 就是为了对外暴露&#xff0c;方便别人调用&#xff0c;将当前Group组的信息注册到其 Scheme 中&#xff0c;以便了解该 Group 组的数据结构&#xff0c;用于后续处理 项目版本用途使用场景k8s.io/apiV1注册资源某一外部版本数据结构&#xff0…...

uni-app写的微信小程序每次换账号登录时出现缓存上一个账号数据的问题

uni-app写的微信小程序每次更换另外账号登录时出现缓存上一个账号数据的问题&#xff1f; 清除缓存数据&#xff1a;在 onShow 钩子中&#xff0c;我们将 powerStations、list 和 responseRoles 的值重置为初始状态&#xff0c;以清除之前的缓存数据。重新获取数据&#xff1a…...

数据分析流程中的Lambda架构,以及数据湖基于Hadoop、Spark的实现

文章目录 一、Lambda架构1、Lambda的三层架构2、简单解释&#xff1a;3、Lambda架构的优缺点 二、数据湖基于Hadoop、Spark的实现1、架构2、数据管理&#xff08;存储层的辅助功能&#xff09; 一、Lambda架构 1、Lambda的三层架构 Batch View&#xff08;批处理视图层&#…...

Android 原生解析 Json 字符串

Android 原生解析 JSON 字符串 1. JSON 基础2. Android 原生 JSON 解析方法2.1 解析 JSON 字符串到 JSONObject关键方法 2.2 解析 JSON 数组到 JSONArray关键方法 2.3 解析嵌套的 JSON 对象 3. 处理异常4. 总结 在 Android 开发中&#xff0c;我们经常需要从服务器获取 JSON 格…...

Windsurf可以上传图片开发UI了

背景 曾经羡慕Cursor的“画图”开发功能&#xff0c;这不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…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...