倉庫の通路でゴールまでの最短の歩数

  • 迷路と盤面
  • 問題 14
  • ふつう
  • 目安 31 分

棚と通路の地図から、スタートからゴールまで何歩で行けるかを求める。幅優先探索で、近いマスから順に距離を決めていく練習です。

本番の試験は PC で受けることが多いので、PC での練習をすすめます。スマホでも、読んで、書いて、採点するところまで動きます。

入力は標準入力から読み、答えは標準出力に書きます。1 テストあたり 2 秒までです。

問題

ある倉庫の床の地図が、H 行 W 列のマス目で与えられます。各マスは次のどれかの文字で表されます。

  • . は通路で、通れます
  • # は棚で、通れません
  • S はスタートの位置で、通れます
  • G はゴールの位置で、通れます

作業員は 1 歩で、上下左右のとなりのマスへ 1 つだけ動けます。ななめには動けず、地図の外にも出られません。スタートからゴールまで行くのに必要な最少の歩数を出力してください。ゴールまで行けないときは -1 を出力してください。

入力の形式

H W
s_1
s_2
...
s_H

1 行目に行の数 H と列の数 W が半角の空白 1 つで区切られて並びます。続く H 行は地図で、i 行目の s_i は長さ W の文字列です。

出力の形式

最少の歩数を 1 行で出力します。行けないときは -1 を出力します。

制約

  • H と W は、どちらも 1 以上 500 以下です。H × W は 2 以上です
  • 地図は . # S G の 4 種類の文字だけでできています
  • S と G は、地図の中にちょうど 1 つずつあります

入力と出力の例

例 1

左上の S から、右下の G へ向かいます。下へ 2 歩、右へ 3 歩の 5 歩で着きます。これより少ない歩数の道はありません。

入力

3 4
S.#.
.#..
...G

出力

5

例 2

真ん中の列が全部棚なので、S のある左側から G のある右側へは行けません。

入力

2 3
S#G
.#.

出力

-1

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

main.py
import sys

data = sys.stdin.read().split()
h, w = int(data[0]), int(data[1])
grid = data[2:2 + h]

# ここから書く
# grid[r][c] が r 行目 c 列目 (どちらも 0 から数える) の文字です

入力

出力

「実行する」を押すと、ここに出力が出ます

できているか「提出して採点」を押すと、隠れたテストを全部走らせて、通ったかをここに出します