BFSでグリッドの2点間の最短距離を求めるPythonプログラム

BFSでグリッドの2点間の最短距離を求めるPythonプログラム
Photo by Vlado Paunovic / Unsplash

N*Mのグリッドが与えられた際に、障害物を除いた道のみを通り、スタート地点からゴール地点までの最短経路を見つけるPythonプログラムを作成します。

条件

  • グリッドは二次元配列の行列で与えられる。
  • グリッドのサイズはN*Mで変化する。
  • 上下左右のみ移動可能、斜め移動はできない。
  • 障害物は # で表現され、そのセルを通過することはできない。
  • 道は . で表現され、そのセルは通過することができる。
  • スタート地点は S で表現され、必ず1つである。
  • ゴール地点は G で表現され、必ず1つである。
  • ゴール地点を発見した場合、スタート地点からゴール地点までの最短距離を出力する。
  • ゴール地点を発見できなかった場合、 -1 を出力する。

アルゴリズム

重み付けがされていない為、BFS(幅優先探索)を使用して、最短経路を探します。

以下は、Wikipediaの幅優先探索ページから引用します。

幅優先探索(はばゆうせんたんさく、: breadth first search)はグラフ理論(Graph theory)において木構造(tree structure)やグラフ(graph)の探索に用いられるアルゴリズム。アルゴリズムは根ノードで始まり隣接した全てのノードを探索する。それからこれらの最も近いノードのそれぞれに対して同様のことを繰り返して探索対象ノードをみつける。「横型探索」とも言われる。
幅優先探索は解を探すために、グラフの全てのノードを網羅的に展開・検査する。最良優先探索とは異なり、ノード探索にヒューリスティクスを使わずに、グラフ全体を目的のノードがみつかるまで、目的のノードに接近しているかどうかなどは考慮せず探索する。
幅優先探索 - Wikipedia

プログラム

Python3で記述します。