【题解】Luogu P10752 [COI 2024] Sirologija

news/2026/1/14 9:07:57/文章来源:https://www.cnblogs.com/Seqfrel/p/19343674

思路难以发现但易于理解的题。

题意

\(N\times M\) 的网格中,找尽可能多的路径,要求:

  • 起点在左上角,终点在右下角,路径只能向右和向下延伸
  • 两条路径不能相互穿过
  • 相邻两条路径之间必须包含有洞

求出路径数量的最大值 \(K\)

思路

题面为路径定义了“编号”,描述不是很好理解,所以画一张图:

此时可以看出,路径的“编号”即为从右上到左下的顺序,对应到这张图中就是黑、黄、红、蓝、绿。

可以发现,最优情况即,对于从右上到左下的每一个洞,都分别有一条路径将其围在与上一条路径形成的空隙中,答案为洞的个数 \(+1\)

但因为路径只能向右和向下延伸,所以有一些实际无法通过的空位需要特殊考虑。

第一种情况,两个洞呈右上左下排列,即:

.#
#.

不难发现这时两个空位均无法被路径经过。

第二种情况,边界:

----
.#..

在上边界的洞,右侧空位无法通过。

|.
|#
|.
|.

在左边界的洞,下侧空位无法通过。

.#..
----

在下边界的洞,左侧空位无法通过。

.|
#|
.|
.|

在右边界的洞,上侧空位无法通过。

对于这两种特殊情况,我们可以把无法通过的空位都替换成洞来处理。这样处理的好处在于,如果遇到连锁情况,如:

..#
##.

----
.#..
.#..
.#..

我们可以通过再去判断新替换的洞的情况,处理连锁无法通过的问题。

这启示我们使用 BFS 来把洞补全,完成对特殊情况的处理。

随后,考虑每一个洞是否可以被两个路径围起来。八连通的洞可被视为一个大洞,因为中间没有空位供路径穿过。同时在边界的洞不能计入洞的总数,因为没有路径可以从边界外经过。最后的答案 \(K\) 即为此时洞的总数 \(+1\)

注意以下两种情况:

----
|..#
|..#
|###

左上角起点在处理特殊情况时会被替换成洞。

###|
#..|
#..|
----

右下角终点在处理特殊情况时会被替换成洞。

这两种情况答案都是 \(0\),需要特判输出。

代码

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=2010;
const int dx[9]={0,1,0,-1,0,-1,1,1,-1};
const int dy[9]={0,0,1,0,-1,-1,-1,1,1};
struct Node{int x,y;
};
int n,m,ans;
int a[N][N];
bool vis[N][N];
queue<Node>q,r;
bool bfs(int x,int y){bool flag=1;r.push((Node){x,y});a[x][y]=0;while(!r.empty()){Node f=r.front();int xx=f.x,yy=f.y;if(xx==1||yy==1||xx==n||yy==m) flag=0;r.pop();for(int i=1;i<=8;i++){int qx=xx+dx[i],qy=yy+dy[i];if(qx>=1&&qx<=n&&qy>=1&&qy<=m){if(a[qx][qy]){r.push((Node){qx,qy});a[qx][qy]=0;} }}}return flag;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){char c;cin>>c;if(c=='#'){a[i][j]=1;q.push((Node){i,j});vis[i][j]=1;} }}while(!q.empty()){//一次bfs,处理特殊情况Node f=q.front();int x=f.x,y=f.y;q.pop();if(x==1&&y<m){if(!vis[x][y+1]){a[x][y+1]=1;q.push((Node){x,y+1});vis[x][y+1]=1;}}if(y==1&&x<n){if(!vis[x+1][y]){a[x+1][y]=1;q.push((Node){x+1,y});vis[x+1][y]=1;}}if(x==n&&y>1){if(!vis[x][y-1]){a[x][y-1]=1;q.push((Node){x,y-1});vis[x][y-1]=1;}}if(y==m&&x>1){if(!vis[x-1][y]){a[x-1][y]=1;q.push((Node){x-1,y});vis[x-1][y]=1;}}if(a[x+1][y-1]){if(!vis[x][y-1]){a[x][y-1]=1;q.push((Node){x,y-1});vis[x][y-1]=1;}if(!vis[x+1][y]){a[x+1][y]=1;q.push((Node){x+1,y});vis[x+1][y]=1;}}if(a[x-1][y+1]){if(!vis[x-1][y]){a[x-1][y]=1;q.push((Node){x-1,y});vis[x-1][y]=1;}if(!vis[x][y+1]){a[x][y+1]=1;q.push((Node){x,y+1});vis[x][y+1]=1;}}}if(a[1][1]||a[n][m]){//特判起点终点为洞的情况printf("0\n");return 0;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i][j]){if(bfs(i,j)) ans++;//第二次bfs,搜连通块和判边界} }}printf("%d\n",ans+1);return 0;
}

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

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

相关文章

PFC2D预制裂隙巴西劈裂试验模拟:探索岩石破裂奥秘

pfc2d预制裂隙的巴西劈裂试验模拟在岩石力学研究领域&#xff0c;巴西劈裂试验是一种常用的测试岩石抗拉强度的方法。而通过PFC2D&#xff08;Particle Flow Code in 2D&#xff09;软件对预制裂隙的巴西劈裂试验进行模拟&#xff0c;能帮助我们更深入理解岩石在复杂裂隙条件下…

PSRR仿真教程:解锁电路抗噪能力的密钥

PSRR 仿真教程&#xff0c; 怎么仿真电路的psrr&#xff1f; [1]两个电路案例&#xff0c;一个是16分频的分频器&#xff1b; [2]一个是250MHz的环形压控振荡器&#xff1b; 仿真方法是用Cadence的psspxf。 PSRR的测量对于改善对噪声源的免疫力很重要&#xff1b; 如电源涟漪由…

Python字符串:别只用来打印!这5个高级用法让代码效率翻倍

Python字符串:别只用来打印!这5个高级用法让代码效率翻倍 提到Python字符串,很多人第一反应是“用来存文字、打印输出”。但实际上,字符串作为Python中最常用的内置类型之一,藏着大量高效实用的方法——从字符串拼…

C51_AH3144霍尔传感器

文章目录一、霍尔传感器   1、霍尔传感器分类   2、AH3144&#xff1a;二、代码实例   1、查询方式&#xff08;物体计数&#xff09;   2、外部中 断方式&#xff08;电机测速&#xff09;   3、实例现象一、霍尔传感器 霍尔传感器是一种基于霍尔效应的磁敏传感器&a…

C51_74HC595串口转并口

文章目录一、74HC595   1、芯片引脚   2、内部框图   3、时序操作二、单芯片工模式   1、原理图   2、驱动代码     1&#xff09;、74hc595.h     2&#xff09;、74hc595.c     3&#xff09;、mian.c三、级联工作模式   1、原理图   2、驱动代码 …

【题解】Atcoder ABC432 C

思路 遇事不决先排个序。注意到如果要让所有人分得的糖果重量相等,那么糖更少的人需要的大糖更多。因每人分得糖果数量确定,所以总重量越大,每人需要的大糖数量就越多。为了让大糖总数最多,不妨给糖最少的人全分大…

赶due党救急!论文降重2小时搞定,不熬夜

赶due党救急&#xff01;论文降重2小时搞定&#xff0c;不熬夜 赶due党救急&#xff01;论文降重2小时搞定&#xff0c;不熬夜 嘿&#xff0c;各位赶due党们&#xff01;我是AI菌。今天&#xff0c;咱们就来聊聊那个让无数学生头疼的问题——论文降重。别担心&#xff0c;我不…

5 分钟快速入门 Gitlab CI/CD

&#x1f680; 快速掌握 GitLab CI/CD&#xff1a;自动化你的开发流程 GitLab CI/CD 是一个功能强大的工具&#xff0c;它内置于 GitLab 中&#xff0c;用于自动化你的软件构建、测试和部署流程。如果你希望提升开发效率、减少人为错误并实现持续集成/持续部署&#xff08;CI/…

16 位 SAR ADC 逐次逼近型 ADC 模拟集成电路设计探秘

【16位SAR ADC 逐次逼近型ADC模拟集成电路设计】 16位SAR ADC 同步时序&#xff1b; 采样率1MHz&#xff1b; 动态比较器&#xff1b; 栅压自举采样开关&#xff1b; 测试电路&#xff1b; 精度为14.61&#xff1b; 台湾65nm工艺 下载后可直接使用&#xff0c;保证仿出正确波形…

计算机论文模板推荐:8大平台+AI修改工具

计算机论文模板推荐&#xff1a;8大平台AI修改工具 工具对比速览 工具名称 核心功能 生成速度 适用场景 特色优势 秒篇 全学科初稿生成 20-30分钟 论文初稿快速成型 自动插入图表/公式/代码 aicheck 初稿生成查重 20-30分钟 初稿与查重同步 原创性检测格式规范 …

Lua语法深入1

1. table构造器中,可以混用记录式(record-style)的和列表式(list-style)创建属性字段:polyline = {color="blue",thickness=2,npoints=4, {x=0, y=0}, --polyline[1]{x=-10, y=0…

牛客小白赛-⑨运算(Hard Version)

一、题目链接:https://ac.nowcoder.com/acm/contest/125080/E 二、题目大意:这道题的题目大意是给你一个数x,并给你两种操作。第一种操作可以无限次使用,在当前数上进行+9,第二种操作只能使用一次,在当前数上进行…

【题解】Luogu P13885 [蓝桥杯 2023 省 Java/Python A] 反异或 01 串

思路 对整串反异或有些唬人。但进行反异或操作的时刻是任意的,操作后依然可以往串首尾加数。也就是说,我们可以把问题转化成:一个长度为 \(|T|\) 的 01 串 \(S\),从中选取一段字串对其进行反异或操作使其变为 \(T\…

期待回家,顺便写点年度总结

今天北京下雪了,夜晚校园里的行人都比平时少的多(因为真的很冷),可越是这种寒冷寂寥的环境,越是会让人感觉到忧伤和孤独。 2025年快要结束了,现在已经是12月的12号了,今年也是相当精彩、丰富的,也是繁杂、焦虑…

E No address added out of total 1 resolved地址绑定失败: No address added out of total 1 resolved errors:

问题&#xff1a;运行VScode项目时&#xff0c;出现端口被占用&#xff0c;如何解决。E No address added out of total 1 resolved 地址绑定失败: No address added out of total 1 resolved errors: [listen EADDRINUSE: address already in use 127.0.0.1:50052]原因1&#…

计算机论文题目推荐:8大平台+50例AI生成

计算机论文题目推荐&#xff1a;8大平台50例AI生成 工具名称 主要功能 生成速度 适用场景 特色优势 秒篇 论文初稿生成 20-30分钟 全学科论文初稿 支持自动插入图表/公式/代码 aicheck 论文初稿生成 20-30分钟 全学科论文初稿 原创性高&#xff0c;AI生成率低 a…

【笔记】Manacher

Luogu P3805 【模板】manacher 解决问题:字符串中最长回文子串。 解决方法:求出字符串中每个字符作为回文串中心时最长回文串长度。 朴素做法,对于每个字符向后枚举比较,时间复杂度 \(O(n^2)\)。 Manacher 算法提供…

C51_74HC165并口转串口

文章目录一、74HC165二、74HC165使用   1、引脚   2、工作流程   3、原理图三、实例代码一、74HC165 74HC165 是 8 位并行输入串行输出移位寄存器&#xff0c;它是一款高速 CMOS 器件&#xff0c;遵循 JEDEC 标准。    74HC165 是一款8 位并行输入 - 串行输出的移位寄存…

八上期中考游记

真是失败的人生。 为了 CSP 花费了好多时间,但是变成了最差的一年,怎么回事呢? 语文 \(104\),炸飞了。 数学 \(148\) 挂到 \(140\),年段 rk \(1 \to 8\),这波真是失败的人生。 英语 \(130\),卷子好难,炸杠。 物…

application.properties

[Spring Boot] Java开发实战&#xff1a;Spring Boot应用详解 引言 Spring Boot是Java开发中一个非常重要的框架&#xff0c;它简化了Spring应用的初始搭建和开发过程。作为一年经验的Java开发者&#xff0c;我们需要学习它是因为现在大部分企业级项目都在使用Spring Boot。在实…