せるのブログ

最近ブログはじめました。自分が面白いと思ったことをアウトプットしていきます!

生成した迷路のスタートとゴールを決める【後編】その1

【前編】では、スタートとゴールを決めるときの問題点を説明しました。

cell-0x6dplus.hatenablog.com

 

【後編】その1では、実際にどのようにスタートとゴールを決めるのかを解説したいと思います。プログラムについては【後編】その2で解説します。

考え方

この解説では、31x31で生成した迷路を使用します。

f:id:cell_0x6dplus:20190119231150p:plain

白: 道(path), 黒: 壁(wall)

まず、この迷路を”道”ベースで考えます。道を青で示します。

f:id:cell_0x6dplus:20190119234159p:plain

この道の中で、3つ以上の道に分かれているマスを選択します。選択したマスをノードとし、赤で示します。

f:id:cell_0x6dplus:20190119235441p:plain

それぞれのノードを見た時、ノードにつながる道の状態によって処理します。

  1. 1つの別のノードにつながっている時(ノード1)
    ノードにつながらない(行き止まりの)道の中で、最も長い道以外を削除する。最も長い道が複数ある場合その中の1つだけ残し、その他のノードにつながらない(行き止まりの)道を削除する。
  2. 2つ以上の別のノードにつながっている時(ノード2)
    ノードにつながらない(行き止まりの)道をすべて削除する。

例を示します。

処理前 >> 処理後

f:id:cell_0x6dplus:20190120002828p:plain f:id:cell_0x6dplus:20190120002831p:plain

 この処理を迷路に適用すると以下のようになります。

f:id:cell_0x6dplus:20190120005240p:plain

この処理を迷路内のノードの数が1つ以下になるまで繰り返します。

現在の迷路の状態 >> ノードを選択 >> 処理

f:id:cell_0x6dplus:20190120010042p:plain f:id:cell_0x6dplus:20190120010520p:plain f:id:cell_0x6dplus:20190120011138p:plain

 現在の迷路の状態 >> ノードを選択

f:id:cell_0x6dplus:20190120013358p:plain f:id:cell_0x6dplus:20190120013419p:plain

ここで、迷路内のノード数が1つ以下になったので、以下の処理を行います。ノードが存在しない場合はこの処理はスキップできます。

  1. ノードにつながる道の中から、長い道上位2つを残し、そのほかの道を削除する。

f:id:cell_0x6dplus:20190120013850p:plain f:id:cell_0x6dplus:20190120013905p:plain

これで、迷路の経路を求めることが出来ました。この経路の端をそれぞれスタートとゴールにすれば終了です。

最初の状態と比較してみる

いい感じに経路が決定できていますね!

f:id:cell_0x6dplus:20190120015004p:plain f:id:cell_0x6dplus:20190120015018p:plain

 

これで、考え方の解説を終わります。

考え方の解説が想定よりも長くなってしまったので、これをプログラムにしたものを【後編】その2で解説したいと思います。

 

【後編】その2 >> 時間があったら。