寻找哈基米
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

立希家养的哈基米又不知道跑到哪里去了。
好在立希偷偷地在哈基米的手机里装了GPS,方便随时找回。
现在立希有一张导航地图,上面显示着她(S)和哈基米(T)的方位,空地(.),建筑(#)和街道(M)。
立希可以在四个方向上移动,规则如下:
  • 普通移动:从当前格子移动到相邻的上/下/左/右格子,前提是该格子为.ST,代价为 1 步。
  • 穿过街道:不能踩在 M 上,但允许跨过恰好一个相邻的 M 到它后面的格子(同一方向直线跳 2 格)。落点必须在网格内,且为.ST,代价也为 1 步。
  • # 为不可通过的建筑;M 为街道,不可停留,只能被穿过;. 为可走空地。起点S和终点T视为可走格。
现在立希想知道她是否能到达哈基米的位置;若能到达,那么她走到哈基米位置的最少步数是多少。

输入描述:

第一行输入两个整数 H,W(网格高和宽,1 \le H, W \le 3000)。

接下来 H 行,每行 W 个字符,字符仅包含 S, T, ., #, M,且 S 与 T 各恰好出现一次。

输出描述:

输出一行一个整数ans,为最少步数;若不可达输出 -1。
示例1

输入

复制
4 4
S.M.
.#.#
.M.T
....

输出

复制
4

说明

样例一中,以左上角为坐标系原点,一条最短路径为 (0, 0) → (1, 0) → (1, 1) → (1, 3) → (1, 4).
示例2

输入

复制
3 3
S#T
###
MMM

输出

复制
-1

说明

样例二中,S 和 T 之间没有可达路径.