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

📅  最后修改于: 2023-12-03 14:58:35.372000             🧑  作者: Mango

题目介绍

本题为第30题,题目编号为门|门 CS 1999,是一道算法题。

题目描述

在一个 $n$ 行 $m$ 列的矩阵中,有一些位置是门,其余位置为墙。你从一个起点开始,每次可以向上、下、左、右四个方向移动,但不能穿过墙。你需要求出起点到每个门的最短距离。

输入格式

输入文件的第一行包含 $n$ 和 $m$,表示矩阵的大小。

接下来 $n$ 行,每行 $m$ 个字符,表示矩阵,其中一个字符表示一个格子,如果是 # 表示该位置是墙,如果是 M 表示该位置是起点,如果是 O 表示该位置是门。

输出格式

对于每个门,输出一个整数,表示起点到该门的最短距离。如果无法到达某个门,则输出 $-1$。

样例

输入:

5 5
..#..
..#..
..#O#
..M#.
.....

输出:

4
4
2
-1
-1

解题思路

该问题可以使用广度优先搜索求解。

我们从起点开始,将其加入队列,然后不断进行 BFS,每次取出队头元素,将其四个方向可以走到并且没有走过的格子加入队列,并将这些格子距离起点的最短距离更新。特别地,如果我们遇到一个门,那么它距离起点的最短距离就是当前队头元素的距离加上一,因为只需要再走一步就能到达门了。

需要注意的是,如果某个门无法到达,那么它就永远无法被访问到,因此需要将其标记为已经访问过,避免重复计算。

代码实现

以下是代码实现部分。