筑波大学プログラミングコンテスト2025
コンテスト日時
2025/11/16 (Su) 13:15 - 16:45

C - RDLU maze

Assam
3
s
1024
MB
300

問題文

縦 $H$ マス、横 $W$ マスの盤面があります。
上から $i$ 行目、左から $j$ 列目のマスを マス $(i, j)$ と呼びます。
マス $(i, j)$ の状態は文字 $S_{i,j}$ によって以下のように表されます。

  • #: 壁
  • .: 道
  • S: スタートマス
  • G: ゴールマス

あなたの目的は、盤面内のロボットをスタートマスからゴールマスに移動させることです。

ロボットは のいずれかの 向き を持っています。
最初、ロボットはスタートマスにいて、 向き です。

あなたはロボットに以下の 移動命令 を繰り返し出すことができます。
移動命令 : $1$ 以上の整数 $k$ を $1$ つ指定する。ロボットは現在の 向き に $k$ マス直進し、そのマスで停止する。その後、ロボットの 向き は時計回りに $90$ 度回転する。

ただし、移動の軌跡上や移動先に壁があったり、盤面の外に出たりするような $k$ を指定することはできません。指定できる $k$ が存在しないとき、それ以上 移動命令 を出すことはできません。

ここで、ロボットがマス $(i, j)$ にいるときの移動先は、具体的には次のように表されます。

  • 向き のときに $k$ マス直進する場合、移動先はマス $(i, j+k)$ 。
  • 向き のときに $k$ マス直進する場合、移動先はマス $(i+k, j)$ 。
  • 向き のときに $k$ マス直進する場合、移動先はマス $(i, j-k)$ 。
  • 向き のときに $k$ マス直進する場合、移動先はマス $(i-k, j)$ 。

また、 向き が時計回りに $90$ 度回転すると、具体的には次のように変化します。

  • 現在の 向き ならば、 となる。
  • 現在の 向き ならば、 となる。
  • 現在の 向き ならば、 となる。
  • 現在の 向き ならば、 となる。

ロボットをゴールマスに移動させるまでに指定した $k$ の総和を 総移動マス数 と定義します。
総移動マス数 の最小値を求めてください。
ゴールマスに停止させることが不可能な場合はそれを報告してください。

制約

  • $ 1 \leq H \leq 1000 $
  • $ 1 \leq W \leq 1000 $
  • $ H, W $ は整数である。
  • $S_{i,j}$ は .#SG のいずれかである。
  • スタートマスとゴールマスはちょうど一つずつ存在する。

入力

入力は以下の形式で与えられる。

$H$ $W$
$S_{1,1}S_{1,2} \dots S_{1,W}$
$S_{2,1}S_{2,2} \dots S_{2,W}$
$\vdots$
$S_{H,1}S_{H,2} \dots S_{H,W}$

出力

答えを標準出力に $1$ 行で出力してください。
ロボットをゴールマスに停止させることが不可能な場合は -1 を出力してください。

入力例 1
3 4 ..G# .S.# ....
出力例 1
6

以下の移動命令をすることにより、総移動マス数 $6$ を達成できます。

  • ロボットの初期位置は マス $(2,2)$ であり、 向き です。
  • $k=1$ を指定し、ロボットはマス $(2,3)$ に移動します。 向き に変化します。
  • $k=1$ を指定し、ロボットはマス $(3,3)$ に移動します。 向き に変化します。
  • $k=1$ を指定し、ロボットはマス $(3,2)$ に移動します。 向き に変化します。
  • $k=2$ を指定し、ロボットはマス $(1,2)$ に移動します。 向き に変化します。
  • $k=1$ を指定し、ロボットはマス $(1,3)$ に移動します。 向き に変化します。

ゴールマスに到達したため、総移動マス数は $1+1+1+2+1=6$ です。
総移動マス数 を $5$ 以下にすることができないため、$6$ が答えとなります。

入力例 2
4 4 ##G# #S.# ##.# ##.#
出力例 2
-1

例えば、以下の移動命令を行ったとします。

  • ロボットの初期位置は マス $(2,2)$ であり、 向き です。
  • $k=1$ を指定し、ロボットはマス $(2,3)$ に移動します。 向き に変化します。
  • $k=2$ を指定し、ロボットはマス $(4,3)$ に移動します。 向き に変化します。

この時点で指定できる $k$ が存在しないため、これ以上ロボットは移動することができません。
このように、ロボットが移動できなくなる場合があることに注意してください。

入力例 3
7 8 ..##..## .S..#..# #.....#. ..#..... ....#..# .#...... ..#....G
出力例 3
23
提出
C++23 (g++ 12.2.0)