#P15719. [JAG 2023 Summer Camp #3] Break a Prison

[JAG 2023 Summer Camp #3] Break a Prison

说明

Jennifer 是一家科技公司的软件工程师。她的公司决定参加 ICPC(公司间越狱竞赛),她被选为公司的代表。

在 ICPC 中,每位参与者都需要从一个监狱中逃脱。该监狱可以表示为一个 n×mn \times m 的网格,即它有 nn 行和 mm 列的房间。监狱中第 ii 行第 jj 列的房间记为房间 (i,j)(i, j)

两个房间 (i1,j1)(i_1, j_1)(i2,j2)(i_2, j_2) 相邻,当且仅当 i2i1+j2j1=1|i_2 - i_1| + |j_2 - j_1| = 1。奇怪的是,每对相邻房间之间都有一扇未上锁的门。监狱中的一些房间处于监控之下。参与者只能移动到未被监控的房间。参与者将从某个房间出发。所有参与者的目标是到达一个出口。保证带有出口的房间和参与者出发的房间未被监控。

为了展示公司的才华,CEO 要求 Jennifer 在比赛中不要右转。换句话说,在房间之间的移动中,不得出现任何两次连续的移动满足以下条件:

条件:假设 Jennifer 从房间 (i1,j1)(i_1, j_1) 移动到 (i2,j2)(i_2, j_2),然后她移动到房间 (i3,j3)(i_3, j_3)。那么,$(i_2 - i_1) \times (j_3 - j_2) - (j_2 - j_1) \times (i_3 - i_2) = -1$ 成立。

:::align{center}

图 B.1. 允许和禁止移动的示例 :::

例如,在图 B.1 中,如果上一次移动是沿着虚线箭头方向,则你不能向下移动,但可以向其他三个方向移动。

注意,在此条件下,掉头(U 形转弯)是允许的。

作为 Jennifer 的同事,你的任务是编写一个程序,为她找到到达出口所需的最少房间间移动次数。

输入格式

输入包含一个单独的测试用例,格式如下:

$$\begin{aligned} &n \ m \\ &c_{1,1} c_{1,2} \ldots c_{1,m} \\ &c_{2,1} c_{2,2} \ldots c_{2,m} \\ &\vdots \\ &c_{n,1} c_{n,2} \ldots c_{n,m} \end{aligned}$$

nnmm 表示监狱的大小,每个都是介于 22500500 之间的整数。ci,jc_{i,j}1in1 \leq i \leq n1jm1 \leq j \leq m)是一个描述第 ii 行第 jj 列房间状态的字符。该字符可能是:

  • 'S':表示参与者的起始房间,
  • 'E':表示带有出口的房间,
  • '.':表示该房间未被监控,或
  • '#':表示该房间处于监控之下。

保证输入中 'S' 和 'E' 各恰好出现一次。

输出格式

输出 Jennifer 到达出口所需的最少房间间移动次数。如果她无法到达出口,输出 1-1

2 4
S..#
..E.
3
2 4
S..#
##E.
-1
2 4
S...
##E.
5

提示

在样例输入 3 中,其中一条最优路线如下:

:::align{center}

图 B.2. 样例输入 3 中的最优路线 :::

翻译由 DeepSeek V3.2 完成