2018.08.06【2018提高组】模拟A组题解 引子

事先声明,我不会第三题

T1:

5769. 【2018提高组模拟A组8.6】引子 

题目描述

网上冲浪时,Slavko被冲到了水箱里,水箱由上而下竖直平面。示意图如下:
 
数字i所在的矩形代表一个编号为i的水箱。
1号水箱为水箱中枢,有水管连出。除了1号水箱外,其他水箱上方会接进来恰好一条水管,也可能有水管连出。
连出的水管会从水箱侧面连出去,同一个水箱连出去的水管会在不同的行与侧面连接。每一条水管直接连接两个水箱,这意味着不会把水管分叉也不会出现水管交叉的情况。这样,从一个水箱流入另外一个水箱时,水管的走向始终保持行号增加或保持不变。
水会源源不断地涌进1号水箱直到各个水箱水满为止。帮助Slavko计算出各个水箱装满的次序。

输入

输入会给你一个n*m的点阵,点阵字符的全集为{+,|,-,.}
水箱:形状是矩形,四角有+符号,左右为|,上下为-,里面包含一个数字代表水箱的编号,如上图。
管道:一条管道恰好连接两个不同的水箱,|表示管道竖直摆放,- 表示管道水平摆放,其中竖直的管道之间会连接起来,水平的管道会连接起来,+连接竖直和水平的管道(+的上下恰好其中一个为.一个为|,+的左右恰好其中一个为 . 一个为-)。
其余位置用. 来填充。
输入的第1行为两个正整数n,m。
接下来n行描述点阵的信息,每行有m个字符。

输出

输出水箱被浸满的顺序,每行一个序号。

样例输入

Input 1
12 13
..+--+.......
+-|..|.......
|.|.1|--+....
|.+--+..|....
|......+----+
+---+..|..2.|
....|..+----+
.+--+........
.|...........
+---+........
|.3.|........
+---+........
Input 2
8 10
..........
.......+-+
...+---|1|
...|...+-+
...|......
..+-+.....
..|2|.....
..+-+.....

样例输出

Output 1
2
3
1
Output 2
2
1

【数据范围】
70%的数据:1≤n,m≤100。
100%的数据满足:1≤n,m≤1000

题解:我们发现,水首先会进入第一个水箱,流到一定量后会进入另一个水箱,以此类推,但当水流入一个无法流出的水箱时,不流满它前是不会流满其它水箱的(同一个水箱连出去的水管会在不同的行与侧面连接)

如样例一,其会先流满更低的水箱2,再流满水箱3,最终在无法再流出水时流满水箱1,先后顺序与水箱体积大小和水管长度无关。

所以我们可以暴力找出每个水箱的流入水箱,从流入水箱向当前水箱连条边,边权为这个水管所在的行数,然后从水箱1开始深搜即可。

暴搜,每搜到一个“+”,可以发现其不是水管就是四角,如果“+”号没打过标记,则

  1. 如果其上方没有'|'且右边有“-”则往它右边找到第一个“+”,给两个“+”打上以查找过的标记,如果它上方有'|'则向上找到‘+’号,将其水箱编号标记转移过来,再转移到加号1中。如果加号2上方没"|",就说明两个加号为水箱上边角,先往下搜编号(例如一个水箱编号为二位数时,因为其数字会在一行上,如|.13..|,所以可以从前往后搜数字把数补全),然后向下搜到两个加号角,打上已查找过的标记,给左边的两个“+”打上值为水箱宽的标记,这样每次查到这个加号都可以跳过水箱这一段。再在两边墙壁寻找连出去的水管,找到水管时,将水管第一个转折点的加号打上当前水箱编号的标记,方便转移,然后在水管上顶寻找水管。
  2. 如果其上方有“|”,因为为水箱下边角的情况肯定会被标记,向上找到‘+’号,将其水箱编号标记转移过来,则再将其转移到右边的第一个加号上,给两个“+”打标记
  3. 没了
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值