#CF2041D. 醉酒迷宫

醉酒迷宫

D. 醉酒迷宫
每测试点时间限制:22
每测试点内存限制:10241024 MB

(图片由 ChatGPT 4o 生成)

你得到一个二维迷宫,其中有起点和终点。你的任务是从起点走到终点,找到最快的方式。最快的方式即步数最少,一步是向左、右、上、或下移动一格。当然,你不能穿过墙壁。

但有一个陷阱:如果你在同一个方向连续走超过三步,就会失去平衡并摔倒。因此,禁止在同一个方向连续走超过三步
允许向右走三步,然后向左走一步,然后再向右走三步。这样和直接向右走五步的效果相同,但速度更慢(步数更多)。

输入
第一行包含两个整数 nnmm,表示迷宫的高度和宽度。
接下来是迷宫的 ASCII 表示:

  • # 表示墙
  • . 表示空地
  • ST 表示起点和终点

数据范围:

  • 12n×m20000012 \le n \times m \le 200000
  • 3n,m100003 \le n, m \le 10000
  • 字符只包含 . # S T,有且仅有一个 S 和一个 T
  • 迷宫的外边界全是 #(墙壁)

输出
从起点到终点的最少步数,如果无法到达则输出 1-1

示例

输入 1:

7 12
############
#S........T#
#.########.#
#..........#
#..........#
#..#..#....#
############

输出 1:

15

输入 2:

5 8
########
#......#
#.####.#
#...T#S#
########

输出 2:

14

输入 3:

5 8
########
#.#S...#
#.####.#
#...T#.#
########

输出 3:

-1