迷路パズルを自動生成するプログラム


 

 

図1のような迷路パズルを自動生成するプログラムを考えてみましょう。 入口と出

口は必ず一か所ずつなければなりません。 また、これらを繋ぐユニークな経路も必

要になります。

 

MEIRO-PUZZLE-1.GIF - 2,708BYTES

(図1、Functionviewで作成)

 

まずは、格子点を作り、入口と出口となる場所を選び、そして、それらを結ぶユニー

クな経路を自動生成させることを考えます。  これを実行するプログラムは次のよう

になります。

 

PROGRAM-KEIRO-TANSAKU-FOR-MEIRO-PUZZLE-1.GIF - 7,388BYTES

PROGRAM-KEIRO-TANSAKU-FOR-MEIRO-PUZZLE-2.GIF - 7,096BYTES

PROGRAM-KEIRO-TANSAKU-FOR-MEIRO-PUZZLE-3.GIF - 7,009BYTES

PROGRAM-KEIRO-TANSAKU-FOR-MEIRO-PUZZLE-4.GIF - 8,799BYTES

PROGRAM-KEIRO-TANSAKU-FOR-MEIRO-PUZZLE-5.GIF - 5,286BYTES

 

以下に、  上のプログラムを使って求めた迷路用のユニークな経路を示します(図2

参照)。 青色の入口から赤色の出口まで経路は交差せずに繋がっています。迷路

の壁は黒い点を繋いで後で形成することになります。

 

<入口→青、出口→赤>

MEIRO-PUZZLE-2.GIF - 2,667BYTES

(図2、十進BASICによる2Dグラフィックス)

 

課題(その1)

 

特定の二点間を線で結ぶアルゴリズムは、電子工学などでの多くの応用が考えら

れます。 例えば、回路基板の設計時に使われる自動配線ソフトなどです。 以下の

制約のもとで動く配線ソフトの簡易版を作成してください。

 

(1)配線の総量を最小化する(寄生素子の影響の最小化)

(2)各配線の長さを等しくする(負荷の均一化)

 

自動配線ソフトウェア

 

それでは、壁を形成する為のプログラムを考えましょう。外壁は比較的簡単に形成

できます(図3参照)。入口と出口を除いた部分を壁として描画すれば良い訳です。

 

<入口→青、出口→赤>

MEIRO-PUZZLE-3.GIF - 3,047BYTES

(図3、十進BASICによる2Dグラフィックス)

 

内壁については、次の二つの方針に基づいて描画させます。

 

(1)内壁は経路と交差しない

(2)内壁は閉じた図形を形成しない

 

これらの条件を満たすように形成した内壁を図4に示します。

 

<入口→青、出口→赤>

MEIRO-PUZZLE-4.GIF - 3,479BYTES

(図4、十進BASICによる2Dグラフィックス)

 

外壁にある格子点から経路と交差しないように内壁を形成しています。 また、内壁

同士も連結しないようにしました。 上図を見れば判るように、 左上の部分に孤立し

た格子点が残っています。 残った点を内壁又は外壁に繋げる為のプログラムがさ

らに必要になります。

 

図5は孤立点を繋いだ後の図です。赤い三点が孤立点で、これらをピンクの線で他

の壁に繋いでいます。

 

<入口→青、出口→赤>

MEIRO-PUZZLE-5.GIF - 3,836BYTES

(図5、十進BASICによる2Dグラフィックス)

 

迷路パズルを自動生成する全体プログラムついては、以下のリンクを参考にしてく

ださい。

 

迷路パズルのプログラムコード

 

課題(その2)

 

迷路のサイズを面積で測って4倍になるようにプログラムを修正してください (図6

参照)。

 

<入口→青、出口→赤>

MEIRO-PUZZLE-6.GIF - 4,810BYTES

(図6、十進BASICによる2Dグラフィックス)

 

課題(その3)

 

上のプログラムでは、内壁は必ず外壁上の格子点からスタートしています。外壁と

は繋がっていない内壁を持つようにするには、  プログラムにどのようなコードを追

加しなければなりませんか。また、独立した内壁の存在と経路のユニークさの関係

を議論してください。

 

課題(その4)

 

三次元的な迷路パズルを作ってください。まずは、擬似的なものからスタートしても

構いません。

 

 


 

Topへ