プログラミングの基礎固めと、Pythonの勉強を兼ねてアルゴリズムを勉強中です。今回は『幅優先探索』を勉強しました。AIZU Online Judgeで対応している問題は、『Seven Puzzle』です。基礎的なアルゴリズムのはずですが、ちゃんと組み込むのにかなり苦労しました。また複数言語を勉強しているおかげで、より効率的な組み方をいろんな言語で考えられるのは楽しいですね^^
概要
深さ優先探査の説明は『通勤・通学中に理解する深さ優先探索と幅優先探索』がわかりやすいです。
要点は次の通り。
根ノードで始まり隣接した全てのノードを探索。階層(根ノードからの距離が近い順)にルートを調べる
サンプル問題(AOJ)
Seven Puzzle
Aizu Online Judge。1-7までの数字と、1つ空白のあるパズルをとく問題。
Rubyのサンプルソース
ループで幅優先探査をして全パターンを求める場合。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
もう一つ、無名関数と構造体を使って幅優先探索を行う問題。手当たり次第調べるような単純なアルゴリズムの場合は、再帰を使うとネストしすぎてハマりました。再帰をもう少し効果的に使えるようになりたい!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
|
Pythonのサンプルソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
Aizu Online Judgeのサンプルソース
当面はAOJを解きながら、アルゴリズムの再勉強をしていくつもりです。Ruby/PythonでのAOJの回答は下のリポジトリに保存しておきます。もしツッコミとかあれば是非^^
morizyun/aoj-ruby-python - GitHub