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相关推荐

  1. 洛谷ZHC邀请赛---2018年元旦马拉松欢乐赛之《我的一位程序员朋友》

    emmmmmmmm 现在的时间是北京时间2018年1月2日凌晨2:09 一小时前我开始做这套题(T1在学校水过了) T1:开心农场 传送门:https://www.luogu.org/problemn ...

  2. 洛谷日报索引(2020、2019、2018)

    历年洛谷日报索引 2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https: ...

  3. 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess

    洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...

  4. 2018.07.17 洛谷P1368 工艺(最小表示法)

    传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...

  5. bzoj5248(洛谷4363)(2018九省联考)一双木棋

    题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...

  6. 2018.12.5【WC2017】【LOJ2286】【洛谷P4604】挑战(卡常)

    洛谷传送门 LOJ传送门 解析: 目前LOJ速度rank1.但是洛谷上面有两个40msAC的在我前面(空间还小的出奇,估计连排序的数组都存不下)...估计是面向数据编程.. 说明:博主是一个高一OIE ...

  7. 统计自己洛谷AC题目爬虫

    update on 2018.9.23 洛谷开启了通过题目难度的显示,现在这个爬虫已经没用了,也就看看吧. 本文中的代码转载于https://github.com/ACodreamer/Luogu-A ...

  8. 洛谷P1074 靶形数独 [搜索]

    题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...

  9. 洛谷日报 2020年3月前索引

    2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https://www.luo ...

最新文章

  1. 解决windows 10英文版操作系统中VS2017控制台程序打印中文乱码问题
  2. bzoj3143: [Hnoi2013]游走
  3. 循环矩阵与傅里叶相关的几点性质
  4. Node单线程高并发原理
  5. form图片上传遇到错误
  6. antd中分页器如何自定义_react+antd分页 实现分页及页面刷新时回到刷新前的page...
  7. 新风系统风速推荐表_谈实验室通风系统设计
  8. Julia: save 与 @save
  9. layui表单基本使用
  10. VMware Workstation12安装win 7企业版激活
  11. 半导体物理学学习资源
  12. VBA批量编辑word图片尺寸
  13. 论文解读:记忆网络(Memory Network)
  14. python中的单引号和双引号有什么区别_python中双引号和单引号的区别是什么
  15. 工业设备软件的研发测试
  16. 基于C语言的AES加密算法实现
  17. 数据库查询的降序排列
  18. wget 无法验证某某颁发的证书
  19. Ubuntu16.04搜索不到wifi列表
  20. git解决The authenticity of host ‘github.com (192.30.255.112)‘ can‘t be established问题

热门文章

  1. Redis分布式锁的实现以及原理
  2. 如何提高高层住宅的消防安全性?安科瑞 许敏
  3. 一阶逻辑和高阶逻辑的区别
  4. 文本情感分析综述笔记
  5. 关于信息科技新课标心得
  6. ids Android xml,Android -- ids.xml文件的使用
  7. Repo入门:边玩边学
  8. 苹果电池测试软件i-t,Apple Watch出行绝佳伴侣,CHOETECH磁力充电座评测T313
  9. python雷达开发_用Python Matplotlib绘制雷达地图,Pythonmatplotlib
  10. 蓝桥杯单片机 赛后资料整理——NE555芯片模块与第十届省赛的总结