モジュール詳細:アルゴリズム

レストランのランチョンマット工場で事故があったようだ。

  • モジュール上部のスクリーンは、10個の2桁の数字を順番に表示する。このシーケンスはモジュールのシード値であり、青色の数字から始まる。
  • モジュールは4×4の迷路を生成し、各セルはモジュール上の対応する位置にある電球で表される。
  • 電球のうち2つが点灯する。白い電球は現在地、色のついた電球はゴールを表す。迷路の壁を通らずにゴールまで進むには、グリッドの両側にあるバーを使用する。

迷路の壁の特定

  • このモジュールは、あるアルゴリズムを使って迷路を生成する。使用されるアルゴリズムは、白以外の電球の色によって決定される。
  • 迷路を生成する際、アルゴリズムでは多くの箇所で乱数を使用する必要がある。
    • シードの最初の数字に「ポインタ」を置く。
    • すべてのアルゴリズムが乱数を要求する際、ある数字nが用意される。ポインタ上の数字をnで割った余りを求め、計算に使用する数値を求める。
    • 次に、ポインタをシードの次の数字に移動させる。

忘れてはならない大切なこと

  • 4×4グリッドを囲む外壁は以下のアルゴリズムでは「壁」に分類されない。それでもモジュールを貫通することはできない。
  • すべてのカウントはゼロ・インデックスであり、シーケンスの最初の要素は0番目、2番目の要素は1番目、3番目の要素は2番目と続く。
  • 特に断りのない限り、すべての壁は通行不可能な状態から始まる。

赤い電球:クラスカルのアルゴリズム

  1. 16個の独立した「グループ」から始める。各グループは迷路の各セルを表す。
  2. L をモジュール上にあるすべての壁を右図の順番で並べたリストとする。
  3. 乱数をn = Lにある壁の個数を使用して生成する。(乱数)番目の要素をLから取得する。
  4. この位置にある壁をリストから削除し、この壁を通過可能にして、繋がった2つのグループを1つに統合する。
  5. Lから、自身とグループを結ぶ壁を取り除く。
  6. モジュール上のグループが1つになるまで、ステップ3-5を繰り返す。

緑の電球:プリムのアルゴリズム

  1. 乱数をn = 16を使用して生成する。これは開始セルの位置である。
  2. Aを、既に訪れたセルと上下左右に隣接している、すべてのまだ訪れていないセルを読み順に並べたリストとする。
  3. 乱数をn = Lにある壁の個数を使用して生成する。これは開始セルの位置である。(乱数)番目の要素をAから取得しこのセルをCと呼ぶ。
  4. 乱数をn = Cと上下左右に隣接している、すでに訪れたセルの個数を使用して生成する。これらのセルに北から時計回りに番号をつける。その番号のセルとC間にある壁は通過できる。
  5. すべてのセルに訪れ終わるまで、ステップ2-4を繰り返す。

青い電球:再帰的アルゴリズム

  1. 乱数をn = 16を使用して生成する。これは開始セルの位置である。
  2. Aを、現在のセルと上下左右に隣接している、すべてのまだ訪れていないセルを北から時計回りに並べたリストとする。
  3. Aが空の場合、Aが空でなくなるまで、既に訪れたセルの一つ前のセルに訪れる。
  4. 乱数をn = Aに含まれるセルの個数を使用して生成する。(乱数)番目の要素をAから取得する。このセルをDと呼ぶ。
  5. Dと現在のセルの間にある 壁は通過できる。Dを訪れたものとしてマークする。Dは次の現在位置となる。
  6. すべてのセルに訪れ終わるまで、ステップ2-5を繰り返す。

シアン電球:ハンティング&キル

  1. 乱数をn = 16を使用して生成する。これは開始セルの位置である。
  2. Aを、現在のセルと上下左右に隣接している、すべてのまだ訪れていないセルを北から時計回りに並べたリストとする。
  3. Aが空の場合、現在の位置を、既に訪れたセルと上下左右に隣接している、読み順で最初のまだ訪れていないセルに設定する。その後、
    • Vを、この新しいセルと上下左右に隣接するセルを北から時計回りに並べたリストとする。
    • 乱数をn= Vに含まれるセルの個数を使用して生成する。(乱数)番目の要素をVから取得する。そのセルと新しいセルの間にある壁は通過できる。
    • ステップ2に戻る。
  4. 乱数をn= Aに含まれるセルの個数を使用して生成する。(乱数)番目の要素をAから取得する。このセルをDと呼ぶ。
  5. そのセルとDの間にある壁は通過できる。Dを訪れたものとしてマークする。Dは次の現在位置となる。
  6. すべてのセルに訪れ終わるまで、ステップ2-5を繰り返す。

マゼンタ電球:サイドワインダー

  1. 最上段のセルで共有されている3つの壁を除き、すべての壁が通過できない状態から開始する。
  2. Rを空のセルリストとする。
  3. 2段目の一番左のセルから始め、読み順に進む。各セル(C)に対して以下のステップを実行する。
  4. CRに足す。
  5. Cがその段の右端のセルではない場合、乱数をn = 2を使用して生成する。 この数字が0の場合、Cの右側の壁を通過できるようにする。
  6. そうでない場合、Cがその段の右端のセルであるか乱数が1である場合、乱数をn= Rに含まれるセルの個数を使用して生成する。 (乱数)番目の要素をRから取得し、そのセルの上側の壁を通過できるようにする。その後、Rの中身を空にする。
  7. すべてのセルに適用されるまで、ステップ3–6を繰り返す。

黄色電球:再帰分割

  1. すべての壁が通過できる状態から開始する。全16個のセルは、最初は1つの「グループ」となっている。グループは必ず四角形になる。グループを二分割する線を仕切りと呼ぶ。分割方向とは、その線が伸びる方向のことを指す。
  2. グループGを、読み順で最初にある、高さと幅が両方とも1ではないグループとする。
  3. 以下のルールを使用し、Gの分割方向を取得する。
    • Gの幅が高さより長い場合、垂直方向に分割する。
    • Gの高さが幅より長い場合、水平方向に分割する。
    • Gが正方形の場合、乱数をn = 2を使用して生成する。この数字が0の場合、垂直方向に分割し、そうでない場合は水平方向に分割する。
  4. 乱数をn = Gを求めた方向に分割できる総パターン数を使用して生成する。上から下、左から右の順で仕切りの候補をリストに格納し、(乱数)番目の要素をそのリストから取得する。この仕切りをPと呼ぶ。
  5. P通過できなくなり、Pで分割されたGの各領域は新たな二つのグループとなる。
  6. 乱数をn = Pの長さを使用して生成する。上から下、左から右の順で(乱数)番目にあるP の壁を通過できるようにする。
  7. すべてのグループの幅または高さが1になるまで、ステップ2–6を繰り返す。