SP19216 SMARIO - Super Mario Revisited
题目描述
超级马里奥是历史上最经典的电子游戏之一。在这个问题中,我们再次帮助马里奥去拯救公主。游戏中,每个世界都由一个二维矩形网格表示。有多个这样的世界,每个世界大小为 $R \times C$。每个格子仅能容纳一个物体。
- ‘S’ 表示马里奥的起始位置。
- ‘.’ 表示马里奥可以安全走过的空单元格。马里奥可以从一个空单元格移动到它相邻的四个单元格之一。
- ‘D’ 表示通往下一个世界的管道。
- ‘U’ 表示通往上一个世界的管道。进入带有管道的单元格后,马里奥必须使用管道。
- ‘C’ 表示硬币,马里奥收集硬币后,该单元格变为空单元格。
- ‘#’ 表示砖块,马里奥无法进入。
- ‘M’ 标识怪物(库巴),马里奥必须击败库巴才能拯救公主。游戏的开始,马里奥处于一个空单元格。
马里奥非常坚定,一对一地打败库巴没有问题。但他也非常贪婪,总是想在拯救公主之前收集所有的硬币。如果不能收集齐所有的硬币,他将不去救援。请帮助马里奥找出完成此任务的最少步数。
特别提示:
- 如果最上层世界中出现 'U' 或最下层世界中出现 'D',马里奥无法进入这些单元格。
输入格式
输入包含多个测试用例(最多1000个)。
每个测试用例的第一行包含三个整数 $R$, $C$, $W$,其中 $R \times C$ 表示网格的大小,$W$ 表示世界的数量。接下来是 $R \times W$ 行,每行包含 $C$ 个字符。
前 $R$ 行描述第一个世界,后续 $R$ 行描述第二个世界,以此类推,直到第 $W$ 个世界。
输入以 “0 0 0” 结束。
输出格式
对于每个测试用例,如果马里奥能成功击败怪物并拯救公主,输出“Mario saved the princess in K steps”,其中 $K$ 是所需的最少步数;否则输出“Mario failed to save princess”。
说明/提示
- $1 \le R, C \le 15$
- $1 \le W \le 10$
- 硬币总数 $\le 10$
- 网格中的字符均为 ‘S’, ‘.’, ‘M’, ‘C’, ‘D’, ‘U’, ‘#’
### 输入样例:
```
2 2 1
SM
.D
2 2 2
SM
.D
C.
.U
3 3 2
S.M
C.#
D..
###
C.C
C.U
2 2 1
SM
#C
0 0 0
```
### 输出样例:
```
Mario saved the princess in 1 steps
Mario saved the princess in 7 steps
Mario saved the princess in 8 steps
Mario failed to save princess
```
### 第三个测试用例的说明:
马里奥起始位置在 (0,0, 1)(第一个世界),最优路径是: (0,0,1) -> (1,0,1) -> (2,0,1) -> (2,0,2) -> (1,0,2) -> (1,1,2) -> (1,2,2) -> (2,2,2) -> (2,2,1) -> (1,2,1) -> (1,2,0)。总共需要走 10 步,其中包括 1 次上行和 1 次下行。由于在不同世界之间移动不需要额外步数,减去这两步后,答案是 8 步。
**本翻译由 AI 自动生成**