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 con
int 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;
}

[洛谷 P5053] [COCI2017-2018#7] Clickbait的更多相关文章

  1. LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想

    题目:https://loj.ac/problem/2473 https://www.luogu.org/problemnew/show/P4365 参考:https://blog.csdn.net/ ...

  2. 洛谷P4382 [八省联考2018]劈配(网络流,二分答案)

    洛谷题目传送门 说不定比官方sol里的某理论最优算法还优秀一点? 所以\(n,m\)说不定可以出到\(1000\)? 无所谓啦,反正是个得分题.Orz良心出题人,暴力有70分2333 思路分析 正解的 ...

  3. 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)

    P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...

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

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

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

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

  6. 2018.10.30 一题 洛谷4660/bzoj1168 [BalticOI 2008]手套——思路!问题转化与抽象!+单调栈

    题目:https://www.luogu.org/problemnew/show/P4660 https://www.lydsy.com/JudgeOnline/problem.php?id=1168 ...

  7. [洛谷P1842] 奶牛玩杂技

    题目类型:贪心+证明,经典题 传送门:>Here< 题意:有\(N\)头奶牛,每个奶牛有一个重量\(W[i]\),力量\(S[i]\).定义每个奶牛的压扁程度为排在它前面的所有奶牛的总量之 ...

  8. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  9. 洛谷 P2058 海港 解题报告

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

随机推荐

  1. iview table中的render函数使用

    1.表格列数据内容过多可以用以下两个属性解决: ellipsis:"true', tooltip:true 使每个列的内容如果过多的话变为省略号 2.table中的render函数(实现根据 ...

  2. gulp4.0基本配置,超简单!

    最近复习了一下gulp,目前是4.0版本. 下图是基本目录结构,文件里面的内容可以随意添加,超详细简洁啊! 直接上代码(依赖未完全使用): 项目的所有依赖都可以安装,每个都有详细的注释. const ...

  3. Git 删除大文件的方法

    git 仓库中删除历史大文件   git 仓库中删除历史大文件 在git中增加了一个很大的文件,而且被保存在历史提交记录中,每次拉取代码都很大,速度很慢.而且用删除 提交历史记录的方式不是很实际. 以 ...

  4. Java 学习笔记(14)—— 文件操作

    java文件操作主要封装在Java.io.File中,而文件读写一般采用的是流的方式,Java流封装在 java.io 包中.Java中流可以理解为一个有序的字符序列,从一端导向到另一端.建立了一个流 ...

  5. Team Foundation Server 2015使用教程【10】:团队项目删除

  6. 【Linux】一个定时任务小脚本

    需要一个定时任务,每隔固定时间停止,等待几分钟,然后在启动,每5分钟一个循环. 简要写了一下,如下,未来在优化: 3,8,13,18,23,28,33,38,43,48,53,58 * * * * s ...

  7. 一键自动生成 java junit 测试代码神器 gen-test-plugin 入门介绍

    gen-test-plugin 我们日常编写代码的过程中,经常需要为代码编写测试案例. 随着对代码质量的要求越来越高,很多公司开始通过代码的测试覆盖率作为 QA 的一个评定指标. 本框架可以一键生成所 ...

  8. JMM中的Happens-Before原则

      在java内存模型中,happens-before应该理解为:前一个操作的结果,可以被后续的操作获取,即内存可见性.   为了解决多线程的内存可见性问题,就提出了happens-before原则, ...

  9. 【他山之石】mybatis打印sql日志 相关配置

    背景:mybatis的sql日志打印对我来说一直比较迷,哪怕看过网上很多博客后还是这样,这两天刚好又遇到了问题,要查sql不得已又来查阅,这次终于搞定了. mybatis是有提供日志功能支持的,目前支 ...

  10. 洛谷$P3877\ [TJOI2010]$打扫房间 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 昂考虑把题目的约束条件详细化?就说每个格点能向四连通连边,问能否做到每个格点度数等于2? $umm$就先黑白染色建两排点呗,然后就$S$向左侧连流量为2的边 ...