QOJ.ac

QOJ

時間限制: 10 s 記憶體限制: 1024 MB 總分: 29

#12280. 喜气洋洋

统计

Joy 即将去度长假,因此她雇佣了技术人员安装了一套基于红外激光束的安防系统。技术人员给了她一张图,将她的房子表示为一个有 $R$ 行 $C$ 列单元格的网格。网格中的每个单元格包含以下内容之一:

  • /:一个双面镜,从单元格的左下角延伸到右上角。
  • \:一个双面镜,从单元格的左上角延伸到右下角。
  • -:一个光束发射器,向该单元格左侧和右侧的单元格(如果有)发射水平光束。
  • |:一个光束发射器,向该单元格上方和下方的单元格(如果有)发射垂直光束。
  • #:一堵墙。(注意,房子不一定被墙壁包围;这也是 Joy 需要安防系统的原因之一!)
  • .:什么都没有;该单元格为空。

光束沿直线传播,并穿过空单元格。当光束击中镜子时,它会从镜面反射 90 度并继续传播。当向右传播的光束击中 / 镜子时,它会反射并开始向上传播;向上、向左或向下传播的光束击中 / 镜子时,会分别向右、向下或向左反射。\ 镜子的行为类似:当向右、向上、向左或向下传播的光束击中它时,它会分别向下、向左、向上或向右反射。当光束击中墙壁或超出网格边界时,它会停止。光束穿过其他光束是可以的,但如果光束击中任何光束发射器(包括可能发射该光束的发射器本身),该发射器就会被摧毁!

Joy 希望确保房子里的每个空单元格至少有一束光束穿过,并且没有光束发射器被摧毁,因为那纯粹是浪费钱!不幸的是,技术人员已经安装好了系统,所以 Joy 最多只能将现有的光束发射器旋转 90 度。也就是说,对于任意数量(包括零)的光束发射器,她可以将 - 变为 |,反之亦然。

你能为 Joy 找到实现她目标的方法,或者确定这是不可能的吗?注意,不需要最小化光束发射器的旋转次数。

输入格式

输入的第一行给出测试用例的数量 $T$。接下来是 $T$ 个测试用例。每个测试用例的第一行包含两个整数 $R$ 和 $C$:表示房子的网格行数和列数。接下来是 $R$ 行,每行包含 $C$ 个字符;每个字符为 /\-|#.,如题目所述。

输出格式

对于每个测试用例,输出一行 Case #x: y,其中 $x$ 是测试用例编号(从 1 开始),如果 Joy 无法实现她的目标,则 $y$ 为 IMPOSSIBLE,如果可以,则为 POSSIBLE。然后,如果该情况可行,输出与输入网格相同的 $R$ 行 $C$ 个字符,其中零个或多个 - 被替换为 |,反之亦然。

如果有多个可能的答案,你可以输出其中任何一个。

数据范围

时间限制:每个测试集 20 秒。 内存限制:1 GB。 $1 \le T \le 100$。 $1 \le C \le 50$。 网格中的每个字符均为 /\-|#.。 网格中 - 字符的数量加上 | 字符的数量(即光束发射器的数量)在 1 到 100 之间(含)。 网格中至少有 1 个 . 字符(即空空间)。

小型数据集(测试集 1 - 可见)

$1 \le R \le 5$。 网格中没有 /\ 字符(即没有镜子)。

大型数据集(测试集 2 - 隐藏)

$1 \le R \le 50$。

样例

输入 1

5
1 3
-.-
3 4
#.##
#--#
####
2 2
-.
#|
4 3
.|.
-//
.-.
#\/
3 3
/|\
\\/
./#

输出 1

Case #1: IMPOSSIBLE
Case #2: POSSIBLE
#.##
#||#
####
Case #3: POSSIBLE
|.
#|
Case #4: POSSIBLE
.-.
|//
.|.
#\/
Case #5: IMPOSSIBLE

说明

注意,最后 2 个样例不会出现在小型数据集中。

在样例 1 中,如果将光束发射器放置为向空单元格发射光束,它必然会摧毁另一个光束发射器。因此该情况为 IMPOSSIBLE

在样例 2 中,最左侧的光束发射器必须旋转以覆盖空单元格。最右侧的光束发射器也必须旋转以避免摧毁最左侧的光束发射器。

在样例 3 中,现有的光束发射器已经用它们的光束覆盖了所有空单元格,并且不会互相摧毁,因此输出输入中的网格是可以接受的。然而,请注意我们给出的输出也是正确的。

在样例 4 中,一种可接受的解决方案是旋转所有三个光束发射器。然而,请注意以下输出也是可接受的:

.-.
|//
.-.
#\/

因为对于有镜子的单元格,不需要有光束穿过。(毕竟,谁会去偷巨大的对角线镜子呢?)

在样例 5 中,无论 Joy 选择哪种方向,光束发射器都会摧毁它自己,因此该情况为 IMPOSSIBLE

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.