『幅優先探索』をRuby/Pythonで解いてみました。AIZU Online Judgeで対応している問題は『Seven Puzzle』です。
🚜 概要
深さ優先探査の説明は『通勤・通学中に理解する深さ優先探索と幅優先探索』、
『アルゴリズム図鑑:iOS & Androidアプリ』が分かりやすかったです。
要点は次のとおり。
根ノードで始まり隣接した全てのノードを探索。階層(根ノードからの距離が近い順)にルートを調べる
🐯 サンプル問題(AOJ)
Seven Puzzle
Aizu Online Judge。1-7までの数字と、1つ空白のあるパズルをとく問題。
🎂 Rubyコード
- 01234567がそろった状態(ゴール)からスタートして、0を移動させる
- 幅優先探索で過去に到達していない状態になったら、手数(移動数)を記録
- すでに到達済の状態であれば、スキップ(幅優先探索なら手数が同等かそれ以上となるため)
MOVE_LIST = [ |
もうひとつ、無名関数と構造体を使って幅優先探索を行う問題。手当たり次第調べるような単純なアルゴリズムの場合は、再帰を使うとネストしすぎてハマりました。再帰をもう少し効果的に使えるようになりたい!
def to_xy(str, target) |
🐝 Pythonコード
MOVE = [[1, 4], [0, 2, 5], [1, 3, 6], [2, 7], [0, 5], [1, 4, 6], [2, 5, 7], [3, 6]] |
🐹 Javaコード
import java.io.BufferedReader; |
🐞 GitHubリポジトリ
当面はAOJを解きながら、アルゴリズムの再勉強をしていくつもりです。Ruby/PythonでのAOJの回答は下のリポジトリに保存しておきます。もしツッコミとかあればぜひ。
morizyun/aoj-ruby-python - GitHub