📜  门|门 CS 1999 |第 64 题(1)

📅  最后修改于: 2023-12-03 15:12:46.156000             🧑  作者: Mango

门|门 CS 1999 |第 64 题

介绍

该题目是一道典型的搜索算法题目,需要使用深度优先搜索或者广度优先搜索来解决。题目要求在一个迷宫中找到从起点到终点的最短路径,并输出路径上每个地方的门。

题目描述

假设有一个 $n$ 行 $m$ 列的迷宫,每个位置要么是障碍物要么是空地,从左上角 $(1,1)$ 出发,到右下角 $(n,m)$ 结束,每次只能向上下左右四个方向移动,请求出从起点到终点的最短路线,并且在路径上标出所有的门。

输入

第 $1$ 行:$n,m$,表示迷宫的大小。

接下来的 $n$ 行:每行 $m$ 个字符,表示迷宫的布局。其中,字符 $‘.’$ 表示空地,字符 $‘#’$ 表示障碍物,字符 $‘S’$ 表示起点,字符 $‘G’$ 表示终点,字符 $‘M’$ 表示门。

需要注意的是,输入的迷宫中至少有一个起点和一个终点,并且迷宫是连通的。

1<=n,m<=100

输出

输出从起点到终点的最短路径,并将路径上经过的所有门标记出来。

输出格式:一行字符串,用来表示路径,字符串中的字符 $‘.’$ 表示路径,字符 $‘M’$ 表示路径上的门,字符 $‘S’$ 表示起点,字符 $‘G’$ 表示终点。

样例

输入:

5 5
S.M.M
..#..
.M.#.
.##..
G....

输出:

S.MM.
..#M.
.M#..
.##..
G....
解题思路

该题目可以使用深度优先搜索或者广度优先搜索来解决。

具体的思路是使用一个队列来存储当前搜索到的位置以及从起点到达该位置的路径。搜索过程中需要维护一个距离矩阵来记录每个位置到起点的最短距离,以此判断是否需要更新队列。

此外,为了标记路径上的门,可以使用一个二维的布尔数组来记录某个位置是否已经被经过。

最后,需要注意对于重复位置的处理,避免多次进入同一个位置。