[洛谷 P5053] [COCI2017-2018#7] Clickbait
Description
下图是一个由容器和管道组成的排水系统。对于这个系统,\(Slavko\) 想知道如果一直向容器1灌水,那么所有容器从空到充满水的顺序。
系统共有 \(K\) 个容器标号为1到 \(K\) 。整个系统可以用 \(N\) 行 \(M\) 列的字符矩阵描述。所有容器都是矩形的,容器和管道的边界用下列字符表示:
‘-’:表示边界的水平部分
‘|’:表示边界的垂直部分
‘+’:表示边界的顶点,即水平与垂直部分的交界点。特别的,容器与管道的交接点使用容器边界的表示字符。
每个容器内部,存在某个位置开始的一串数字表示容器编号,而其它位置都由‘.’表示。例如,标号12的容器内部会出现”12”。
对于除了容器1以外的所有容器,有且仅有一个供水管道从容器上方边界进入。容器1没有供水管道。
每个容器可以有0到多个排水管道从侧面边界连出。同一容器的多个排水管道一定具有不同的高度(即从矩阵不同的行连出)。
每个管道直接连接两个容器,多个管道之间不会相交。每条管道中的水从源容器径直流向目标容器,且管道路线只会向同一行或者下一行延伸。亦即,管道下降后不会再回到之前经过的行。
进入的水在容器中不断积累直到充满容器。在此过程中,如果水面到达容器某个排水管道的高度,接下来的水会从管道流出直到管道填满。
请你帮助 \(Slavko\) 找出容器被灌满的顺序。
注:测试数据保证每个‘+’的上下左右都是一个‘|’、一个‘-’和两个‘.’组成,而且管道只与进入和排出的容器相邻,进入时连接字符为‘|’,排出时连接字符为‘-’。
Input
第一行为两个整数 \(N\)、\(M\)。
接下来 \(N\) 行,每行 \(M\) 个字符,为表示系统的矩阵。
Output
请你输出 \(K\) 行,第 \(i\) 行为第 \(i\) 个被水填满的容器编号。数据保证顺序唯一。
Sample Input
12 13
..+--+.......
+-|..|.......
|.|.1|--+....
|.+--+..|....
|......+----+
+---+..|..2.|
....|..+----+
.+--+........
.|...........
+---+........
|.3.|........
+---+........
Sample Output
2
3
1
HINT
样例解释:从容器1开始灌水。水面到达高度1时,开始从管道流向容器2。容器2灌满以后,容器1的水面开始继续上升,直到到达高度2,此时开始从管道流向容器3。容器3灌满以后,容器1的水面继续上升直到灌满容器。
【数据规模与约定】
对于 \(70%\) 的数据,\(1 \leq N, M \leq 100\)。
对于 \(100%\) 的数据,\(1 \leq N, M \leq 1000\)。
来源:\(NOI2019\) 北京队集训
想法
第一眼看题没懂,感觉好怕怕
后来再看,就是个大模拟。写完还挺有成就感【捂脸】
代码
#include<cstdio>
#include<iostream>
#include<algorithm>using namespace std;const int N = 1005;int n,m;
char mp[N][N];
int be[N][N];struct con{int l,r,u,d;
}d[N*N];
int k;void get_con(int x,int y,int id){int i=x,j=y;while(mp[i][j]!='|') j--; d[id].l=j;j=y;while(mp[i][j]!='|') j++; d[id].r=j;j=y;while(mp[i][j]!='-') i--; d[id].u=i;i=x;while(mp[i][j]!='-') i++; d[id].d=i;for(j=d[id].l;j<=d[id].r;j++) be[d[id].u][j]=id;
}int find(int x,int y,int dir){while(!be[x][y]){if(mp[x][y]=='-'){if(dir==3) y--;else y++;}else if(mp[x][y]=='|') {if(dir==0) x--;else x++;}else{if(dir==3 || dir==1){if(x>0 && mp[x-1][y]=='|') x--,dir=0;else x++,dir=2;}else{if(y>0 && mp[x][y-1]=='-') y--,dir=3;else y++,dir=1;}}}return be[x][y];
}
void dfs(int u){int v;for(int i=d[u].d;i>=d[u].u;i--){v=0;if(d[u].l>0 && mp[i][d[u].l-1]=='-') v=find(i,d[u].l-1,3);if(d[u].r<m-1 && mp[i][d[u].r+1]=='-') v=find(i,d[u].r+1,1);if(v) dfs(v);}printf("%d\n",u);
}int main()
{scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%s",mp[i]);//find conint x;for(int i=0;i<n;i++)for(int j=0;j<m;j++){if(!isdigit(mp[i][j])) continue;x=mp[i][j] -'0';while(j+1<m && isdigit(mp[i][j+1])) x=x*10+mp[i][++j]-'0';k=max(k,x);get_con(i,j,x);}dfs(1);return 0;
}
转载于:https://www.cnblogs.com/lindalee/p/11144266.html
[洛谷 P5053] [COCI2017-2018#7] Clickbait相关推荐
- 洛谷ZHC邀请赛---2018年元旦马拉松欢乐赛之《我的一位程序员朋友》
emmmmmmmm 现在的时间是北京时间2018年1月2日凌晨2:09 一小时前我开始做这套题(T1在学校水过了) T1:开心农场 传送门:https://www.luogu.org/problemn ...
- 洛谷日报索引(2020、2019、2018)
历年洛谷日报索引 2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https: ...
- 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess
洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...
- 2018.07.17 洛谷P1368 工艺(最小表示法)
传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...
- bzoj5248(洛谷4363)(2018九省联考)一双木棋
题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...
- 2018.12.5【WC2017】【LOJ2286】【洛谷P4604】挑战(卡常)
洛谷传送门 LOJ传送门 解析: 目前LOJ速度rank1.但是洛谷上面有两个40msAC的在我前面(空间还小的出奇,估计连排序的数组都存不下)...估计是面向数据编程.. 说明:博主是一个高一OIE ...
- 统计自己洛谷AC题目爬虫
update on 2018.9.23 洛谷开启了通过题目难度的显示,现在这个爬虫已经没用了,也就看看吧. 本文中的代码转载于https://github.com/ACodreamer/Luogu-A ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- 洛谷日报 2020年3月前索引
2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https://www.luo ...
最新文章
- 解决windows 10英文版操作系统中VS2017控制台程序打印中文乱码问题
- bzoj3143: [Hnoi2013]游走
- 循环矩阵与傅里叶相关的几点性质
- Node单线程高并发原理
- form图片上传遇到错误
- antd中分页器如何自定义_react+antd分页 实现分页及页面刷新时回到刷新前的page...
- 新风系统风速推荐表_谈实验室通风系统设计
- Julia: save 与 @save
- layui表单基本使用
- VMware Workstation12安装win 7企业版激活
- 半导体物理学学习资源
- VBA批量编辑word图片尺寸
- 论文解读:记忆网络(Memory Network)
- python中的单引号和双引号有什么区别_python中双引号和单引号的区别是什么
- 工业设备软件的研发测试
- 基于C语言的AES加密算法实现
- 数据库查询的降序排列
- wget 无法验证某某颁发的证书
- Ubuntu16.04搜索不到wifi列表
- git解决The authenticity of host ‘github.com (192.30.255.112)‘ can‘t be established问题