P13209 [GCJ 2016 Finals] Map Reduce
题目描述
天才游戏设计师 Ben 正在为他即将发布的增强现实手游设计地图。最近,他制作了一张地图,用一个 $\mathbf{R}$ 行 $\mathbf{C}$ 列的矩阵表示。地图由若干 `.` 字符(表示空地)、若干 `#` 字符(表示不可通过的墙)、一个起点 `S` 和一个终点 `F` 组成。例如,地图可能如下所示:
```
#############
#S..#..##...#
###.##..#.#F#
#...##.##.###
#.#.........#
#############
```
在 Ben 的游戏中,一条路径是一系列上下左右的步伐,从一个格子走到另一个格子,且不能经过任何不可通过的墙。
Ben 认为一张好地图需要满足以下条件:
- 任意两个空地(包括起点和终点)之间都存在一条路径。
- 为了保证结构完整性,不可通过的墙必须在边上相连,而不能只是通过角相连。对于地图中的任意 $2 \times 2$ 区域,如果该区域恰好有两堵墙,这两堵墙必须在同一行或同一列。换句话说,不能存在如下两种 $2 \times 2$ 区域的墙分布:
```
#. .#
.# #.
```
- 地图的边界只能由不可通过的墙组成。一个格子被认为是边界,如果它在最上/最下行,或最左/最右列。
最短路径长度指的是从起点到终点所需的最少步数。例如,上述例子的最短路径长度为 $17$ 步。
作为如此聪明的制图者,Ben 发现他设计的这张地图对朋友们来说太难了。他希望通过移除一些不可通过的墙来降低难度。具体来说,他想知道是否可以移除零个或若干墙,使得从起点到终点的最短路径恰好为 $\mathbf{D}$ 步,并且修改后的地图依然是好地图。注意,仅仅找到一条长度为 $\mathbf{D}$ 的路径是不够的,$\mathbf{D}$ 必须是最短路径长度。
例如,如果 $\mathbf{D}=15$,我们可以移除终点正下方的一堵墙,得到一个合法解:
```
#############
#S..#..##...#
###.##..#.#F#
#...##.##.#.#
#.#.........#
#############
```
如果 $\mathbf{D}=5$,则没有解。
输入格式
输入的第一行包含一个整数 $\mathbf{T}$,表示测试用例组数。接下来有 $\mathbf{T}$ 组测试用例。每组数据第一行为三个空格分隔的整数 $\mathbf{R}$、$\mathbf{C}$ 和 $\mathbf{D}$,分别表示地图的行数、列数,以及期望的最短路径长度。接下来 $\mathbf{R}$ 行,每行包含 $\mathbf{C}$ 个字符(为 `.`、`#`、`S` 或 `F`),表示 Ben 的地图。
保证输入地图均为好地图(如题面描述)。
输出格式
对于每组测试用例,输出一行 `Case #x: y`,其中 $x$ 为测试用例编号(从 1 开始),$y$ 为 POSSIBLE 或 IMPOSSIBLE,分别表示能否通过移除若干堵墙(可为零)使得最短路径长度恰好为 $\mathbf{D}$,且修改后的地图依然是好地图。如果可行,继续输出 $\mathbf{R}$ 行,每行 $\mathbf{C}$ 个字符,表示新的地图。输出时,移除的墙用 `.` 替换原有的 `#`。
若有多种方案,可输出任意一种。
说明/提示
**样例解释**
样例输出展示了一组可能的答案,其他答案也可能是正确的。
样例第 1 组即为题面中的例子。
样例第 2 组中,可以移除一些墙使最短路径长度变为 2 或 4,但无法使其恰好为 3。
样例第 3 组中,最短路径本身就是 11 步,因此无需移除墙。
**限制条件**
- $1 \leq \mathbf{T} \leq 100$。
- 每组数据恰好有一个 $\mathbf{S}$ 和一个 $\mathbf{F}$。
- 输入文件大小不超过 3MB。
**小数据集(测试集 1 - 可见)**
- 时间限制:~~60~~ 15 秒。
- $3 \leq \mathbf{R} \leq 40$。
- $3 \leq \mathbf{C} \leq 40$。
- $1 \leq \mathbf{D} \leq 1600$。
**大数据集(测试集 2 - 隐藏)**
- 时间限制:~~300~~ 75 秒。
- $3 \leq \mathbf{R} \leq 1000$。
- $3 \leq \mathbf{C} \leq 1000$。
- $1 \leq \mathbf{D} \leq 10^6$。
- 注意:大数据集的输出突破了 Code Jam 通常的输出大小限制,但你可以正常上传。
翻译由 GPT4.1 完成。