迷宫问题
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给定一个由 n 行 m 列组成的二维迷宫,其中 n × m ≤ 2 × 105。每个格子要么是 (不可通行),要么是 (可通行)。迷宫中存在 一扇门 和 一把钥匙,且它们的坐标互不相同。

你从起点 (0, 0) 出发,希望到达终点 (n-1, m-1)。移动规则如下:

  • 每次可以向 上、下、左、右 四个方向移动一格。

  • 如果目标格子是 ,则无法移动。

  •  所在的格子 只有拿到钥匙后才能通过,否则无法进入。

  • 钥匙 所在的格子可以自由进入,并且 一旦到达钥匙的位置,就视为永久持有钥匙

你的任务是确定是否能够走出迷宫(到达终点)。如果可以输出"YES" ,否则返回输出"NO"

输入描述:

  • 第一行包含两个整数 n 和 m,表示迷宫的行数和列数。

  • 接下来的 n 行,每行包含 m 个字符,表示迷宫地图:

    • '.' 表示 (可通行)。

    • '#' 表示 (不可通行)。

    • 'D' 表示 (仅能持钥匙通过)。

    • 'K' 表示 钥匙(拾取后永久持有)。

  • 保证 'D' 和 'K' 各出现一次。

输出描述:

输出一个整数,表示从 (0, 0) 到 (n-1, m-1) 的最短路径步数。如果无法到达,输出 -1
示例1

输入

复制
3 3
.KD
#..
##.

输出

复制
YES

说明

(0,0) -> (0,1)[拿到钥匙] -> (0,2)[开门] -> (1,2) -> (2,2) 
示例2

输入

复制
2 2
.D
#K

输出

复制
NO

说明

无法到达终点
示例3

输入

复制
4 4
...K
#.##
..D.
.#..

输出

复制
YES

说明

需要先拿到钥匙再走往终点的通路
示例4

输入

复制
4 5
...K.
#.##.
..D..
.#...

输出

复制
YES

说明

可以直接到达终点

备注:

你会输出最短到达终点的路径吗?