#P13145. [GCJ 2018 #2] Falling Balls
[GCJ 2018 #2] Falling Balls
Description
某种玩具由一个有 列或更多列、 行或更多行的网格组成,网格的每个格子中要么放有一个 斜坡,要么放有一个 斜坡,要么为空。最左边和最右边的两列始终为空,最底下一行也始终为空。小球会从最顶上一行的每一列各投放一个,并垂直下落,遇到斜坡会滑动。为了防止小球卡住,任意一个放有 斜坡的格子左侧,绝不会紧挨着一个放有 斜坡的格子。
当一个小球从顶行落下时,它的移动规则如下:
- 如果小球当前在一个空格子中,则会直接落到正下方的格子,除非已经在最底行,此时小球不再移动。
- 如果小球当前在一个放有 斜坡的格子中,则会落到右下方的格子。
- 如果小球当前在一个放有 斜坡的格子中,则会落到左下方的格子。
为了完整展示这个机制,用户会在每一列的顶行各投放一个小球。小球之间互不影响,一个格子中可以有多个小球。
你的朋友有这样一个玩具,列数为 ,行数未知。他在每一列的顶行各投放了一个小球,等所有小球都停止移动后,统计了每个底行格子里最终有多少个小球,并把这个结果告诉了你……但你怀疑他可能记错了。你能否构造出一个满足这些结果的布局,并且使用尽可能少的行数?或者判断根本不存在这样的布局?
例如,如果你朋友报告的底行结果是 ,一种可能的解法如下(注意不要求斜坡数量最少,也不要求每个斜坡都必须影响小球的路径):
./\\...
./\.\/.
.......
下图展示了小球在该网格中的下落路径:

Input Format
第一行输入测试用例数 。接下来有 组测试数据。每组数据第一行为一个整数 ,表示朋友的玩具有多少列。接下来一行有 个整数 ,第 个整数表示朋友统计的底行从左到右第 个格子里最终有多少个小球。
Output Format
对于每组测试数据,输出一行 Case #x: y,其中 是测试编号(从 开始), 是你构造的布局所需的最少行数,或者如果不存在这样的布局则输出 IMPOSSIBLE。如果 不是 IMPOSSIBLE,则接下来输出 行,依次表示你构造的玩具布局的每一行,从上到下。用 . 表示空格子,\ 或 / 分别表示对应的斜坡。布局必须满足题目中的所有规则。
3
4
1 1 1 1
3
0 2 1
6
3 0 0 2 0 1
Case #1: 1
....
Case #2: IMPOSSIBLE
Case #3: 3
.//\..
./\./.
......
Hint
样例解释
注意,最后一个样例不会出现在测试集 1 中。
对于样例 1,唯一的有效解法如下(必须至少有一行,增加更多行会导致行数不最少。底行不能有任何斜坡):
....
对于样例 2,没有办法阻止最左边的小球直接落到底部,因为那一列不能放斜坡。
样例 3 就是题目描述最后给出的例子。注意,下面这个布局是非法的,因为它有多余的行数,左、右边界和底行都放了斜坡,而且出现了 斜坡左侧紧挨着 斜坡的情况:
\\..\/
../.\/
./../.
..../.
数据范围
- 。
- ,对所有 均成立。
- 所有 之和等于 。
测试集 1(5 分,公开)
- 。
测试集 2(12 分,隐藏)
- 。
由 ChatGPT 4.1 翻译
京公网安备 11011102002149号