P13173 [GCJ 2017 #2] Beaming With Joy
题目描述
Joy 即将去度长假,因此她雇佣了技术人员为她安装一个基于红外激光束的安防系统。技术人员给了她一张图纸,将她的房子表示为一个 $R$ 行 $C$ 列的单元格网格。每个单元格包含以下之一:
- `/`:一面双面镜,从单元格的左下角延伸到右上角。
- `\`:一面双面镜,从单元格的左上角延伸到右下角。
- `-`:一个水平激光发射器,会向该单元格左右相邻的单元格(如果有)发射水平激光束。
- `|`:一个垂直激光发射器,会向该单元格上下相邻的单元格(如果有)发射垂直激光束。
- `#`:一面墙。(注意,房子不一定被墙包围,这也是 Joy 需要安防系统的原因之一!)
- `.`:空单元格,什么都没有。
激光束会沿直线传播,并穿过空单元格。当激光束遇到镜子时,会以 90 度角反射并继续传播。当向右传播的激光束遇到 `/` 镜子时,会反射并向上传播;而向上、向左或向下传播的激光束遇到 `/` 镜子时,会分别反射并向右、向下或向左传播。`\` 镜子的反射方式类似:当激光束向右、上、左或下传播时遇到它,会分别反射并向下、向左、向上或向右传播。当激光束遇到墙壁或超出网格边界时,会停止传播。激光束可以与其他激光束交叉,但如果激光束击中任何激光发射器(包括可能是发射该激光束的发射器本身),该激光发射器会被摧毁!
Joy 希望确保房子里的每个空单元格都至少有一束激光通过,并且没有任何激光发射器被摧毁,否则就浪费钱了!不幸的是,技术人员已经安装好了系统,所以 Joy 现在最多只能将一些现有的激光发射器旋转 90 度,也就是说,可以将任意数量(包括 0 个)的 `-` 改为 `|`,或将 `|` 改为 `-`。
你能帮 Joy 判断是否有办法达成她的目标,或者判断是否不可能实现吗?注意,不要求最小化旋转激光发射器的数量。
输入格式
输入的第一行是测试用例数 $T$。接下来有 $T$ 组测试数据。每组数据的第一行为两个整数 $R$ 和 $C$,表示房子的网格有 $R$ 行 $C$ 列。接下来 $R$ 行,每行 $C$ 个字符,字符为 `/`、`\`、`-`、`|`、`#` 或 `.`,含义如题目描述所述。
输出格式
对于每个测试用例,输出一行,格式为 `Case #x: y`,其中 $x$ 是测试用例编号(从 1 开始),$y$ 为 IMPOSSIBLE(如果 Joy 无法达成目标)或 POSSIBLE(如果可以达成目标)。如果可能,请在接下来的 $R$ 行输出修改后的网格(与输入格式相同),其中可以有若干 `-` 被替换为 `|` 或反之。
如果有多种可行解,输出任意一种即可。
说明/提示
**样例解释**
注意,最后两个样例不会出现在 Small 数据集中。
在样例 1 中,如果一个激光发射器被设置为发射激光覆盖空单元格,则必然会摧毁另一个激光发射器。因此该情况为 IMPOSSIBLE。
在样例 2 中,最左侧的激光发射器必须旋转以覆盖空单元格。最右侧的激光发射器也必须旋转,以避免摧毁最左侧的激光发射器。
在样例 3 中,现有的激光发射器已经覆盖了所有空单元格且不会互相摧毁,因此直接输出输入网格即可。当然,给出的输出也是正确的。
在样例 4 中,一种可行解是将三个激光发射器全部旋转。不过,以下解也是可行的:
```
.-.
|//
.-.
#\/
```
因为镜子所在的单元格不需要有激光通过。(毕竟没人会偷巨大的斜面镜子,对吧?)
在样例 5 中,无论激光发射器如何旋转,都会自我摧毁,因此该情况为 IMPOSSIBLE。
**数据范围**
- $1 \leq T \leq 100$。
- $1 \leq C \leq 50$。
- 网格中的每个字符为 `/`、`\`、`-`、`|`、`#` 或 `.`。
- 网格中 `-` 和 `|`(即激光发射器)的总数在 $1$ 到 $100$ 之间。
- 至少有 $1$ 个 `.`(即空单元格)。
**小数据集(测试集 1 - 可见)**
- $1 \leq R \leq 5$。
- 网格中没有 `/` 或 `\`(即没有镜子)。
**大数据集(测试集 2 - 隐藏)**
- $1 \leq R \leq 50$。
由 ChatGPT 4.1 翻译