廊下をあまり持たずにすべての部屋をつなぐハイブのような構造にすることは可能ですか?(1つの部屋から来る3-4以上の廊下が多すぎる)
以下は、私の部屋がどのように見えるかの出力です。基本的にはランダムに配置されています。
廊下ごとに実現したいこと。
廊下をあまり持たずにすべての部屋をつなぐハイブのような構造にすることは可能ですか?(1つの部屋から来る3-4以上の廊下が多すぎる)
以下は、私の部屋がどのように見えるかの出力です。基本的にはランダムに配置されています。
廊下ごとに実現したいこと。
回答:
さて、私が考えることができる最も簡単な方法は、すべての部屋が少なくとも1つの廊下で接続されていることを確認することから始まります。
これで、すべての部屋に到達できることがわかりましたが、この厳密に線形の迷路以上が必要な場合は、部屋をステップスルーして、部屋を接続するための新しいパスをランダムに作成し、部屋ごとに2〜3個の制限まで、または部屋の特定の割合が最大接続数に達するまで-など
最後のステップとして、さまざまな状況に合わせて結果を変更するルールを追加できます。たとえば、廊下が1つしかない部屋は、定義上、行き止まりになっていることがあります。より多くの行き止まりを作るか、すべてに少なくとも2つの接続があることを確認することで、それらすべてを排除できます。あなたは行き止まりに秘密の通路を作ることができます。あなたはボスルームが行き止まりであることを確認することができます。最初の部屋が行き止まりであることを確認できますが、2番目の部屋には最低X個の接続があることを確認してください。無限の広告。
それぞれの仮定とルールによって、レベルの外観が根本的に変わる可能性がありますが、それは楽しみの一部です!これにより、少なくともハイブ/洞窟のような部屋が開始されます。
これらの部屋は2Dプレーンに埋め込まれたグラフの頂点であるため、これは理論的には巡回セールスマン問題を解決することで実行できます(これはいくつかの部屋で十分です)。明らかに、単純なヒューリスティックが適切であり、妥当なスケーラビリティを可能にします。
すべての部屋間のエッジ(廊下の長さ)を計算します。長さで並べ替えます。サイクルを作成したり、頂点(ルーム)の次数を希望の最大値(3-4)(繰り返し)を超えない限り、最短のコリドーを追加します。サイクルを確認するには、UnionFindを適用するか、小さなデータに対してクイックBFSを実行します。