"""迷路を解きます。最初の奴隷を用意します。通路座標を奴隷の歩行可能座標として登録します。こいつをスタート地点に立たせます。分かれ道のたびに、奴隷を増殖させて袋小路まで進ませます。そのたびにwalkersリストに追加されるので、最終的に全通りのルートがwalkersに登録されることになります。奴隷ひとりにつき再帰関数ひとめぐり。"""奴隷の歩みを処理する再帰関数です。今いるマスの東西南北に道があるか調べます(一度踏んだマスは通れない)。進める場所がない場合、そいつは終了です。道がひとつだけある場合、次のマスへ移動させます。道が2以上ある場合、奴隷を分裂させます。"""道が2以上ある場合の処理です。forが長くなるのヤだから分離しました。進む前の奴隷をコピーしておきます。現奴隷は次のマスへ移動します。コピーした奴隷たちを、それぞれ別の分かれ道へ進ませます。ためwalkersリストに溜めておきます。"""最優秀ゴール者を決めます。関数が長くなるのヤだから分離しました。奴隷の中から、ゴールした連中を取り出します。インデックスとwalker.step_numのディクショナリ。2:10}みたいになる。step_numでの昇順ソート。(0,30)]みたいになる。ゴール者の中で、最短距離をいった者が最優秀ゴール者です。goal_walkers[ranking[0][0]]迷路のマスを定義する。いうのを使ってみたくてさあ。迷路のマスをenumで定義してみます。'*'迷路データを簡単に扱えるようにするクラス。いうのができるようになります。MazeSignsのディクショナリ。マップ文字列を二次元配列にしたものです。通路部分の座標のリストです。この迷路のスタート地点とゴール地点です。"""(private)マップ文字列を二次元配列にして、中身を全部MazeSigns型に変換します。マネしちゃダメな堂々の二重内包表記。"""(private)歩行可能座標のリストを作ります。通路の部分の座標を求めます。"""(private)迷路のスタート地点とゴール地点を求めます。entrances迷路を歩かせる奴隷を作成するクラス。インスタンスひとつひとつに振るIDです。