相互に接続している部屋のリストがある場合、どのようにして孤立した部屋グループを見つけるのですか?


9

私は小さなローグライクを作成しようとしていて、ランダムに生成する部屋と廊下まで行きました。各部屋はインスタンス化されたオブジェクトであり、廊下で接続された他の部屋の配列リストが含まれています。

接続されていない部屋を選別することはできますが、互いに接続されているだけで他のほとんどの部屋には接続されておらず、島を形成している部屋を知るにはどうすればよいですか?

ここで問題をよりわかりやすく説明するために、コンソールからの画像をぼんやりとしたレベルにしています。客室5と6は相互にのみ接続されています。それを検出するためにどのようなアルゴリズムを使用できますか?

ここに画像の説明を入力してください


画像の使用に問題がありますか?このペーストビンリンクは1か月だけ有効です。
MichaelHouse

ええ、私は最初あなたがここで何をしたのか全く理解できませんでした。変更を元に戻しました。
petervaz

1
そもそも別室が無いように作ってみませんか?それとも孤立したセットが欲しいですか?
AlbeyAmakiir 2012年

@AlbeyAmakiirは、以下の別のコメントで述べたように、マップを埋めるまで試行錯誤で部屋を個別に生成します。その後、接続するルーチンを実行してから、それらの島を接続する別のルーチンを実行します。多分複雑すぎますが、別の方法を理解できませんでした。
petervaz 2012年

回答:


14

部屋の完全なリストから始めます。スターティングルームを選びます。その部屋から、接続されているすべての部屋に移動します。訪問する部屋ごとに、部屋のリストから削除し、リストAに追加します。すべての接続を訪問すると、リストに残っている部屋は、スターティングルームまたはリストAのどの部屋にも接続されません。

次に、完全なリストに残っている部屋から部屋を選択し、再度ナビゲートします。今回はリストBに追加します。元のリストに部屋がなくなるまで、このプロセスを続けます。接続されているすべてのルームセットのリストが表示されます。

このような問題は、グラフ理論の問題に簡単に適用できます。たとえば、上記で説明した問題は接続に直接関係しています


1
どの検索ツリーアルゴリズムでも機能するはずです。または、生成アルゴリズムを変更して、この問題を回避できます。生成アルゴリズムを変更する場合は、開始ルームに接続されたランダムな数のルームを生成し、次に、以下のそれぞれに接続されたランダムな数のルームを生成します。次に、既存のルーム間にランダムな接続を追加して、ショートカットを追加します。など。個人的には検索ツリーアルゴリズムを実行します。
ベンジャミンデンジャージョンソン

それは非常に論理的です。疲れたに違いない。ご協力いただきありがとうございます。それが許す限りすぐに受け入れます。
petervaz 2012年

@BenjaminDangerJohnsonあなたのコメントは、この回答ではなく、質問に対してより適切に思われます。
MichaelHouse

@petervaz問題ありません。私のCS学位は結局その用途があると思います。
MichaelHouse

@BenjaminDangerJohnson私の生成アルゴリズムは、スペースを埋めて後で接続を探すまで、ランダムな部屋を配置するだけです。= P作成を変更する前に、接続を修正しようとします。
petervaz 2012年

9

部屋のコレクションは基本的にグラフであり、問​​題はそのグラフで接続されているコンポーネント(「島」)を見つけることに集約されます。

接続されたコンポーネントを見つける簡単な方法は、各頂点からBFS(幅優先検索)を実行することです。頂点AからBFSを実行すると、頂点Aが属する接続コンポーネントのすべての頂点が得られます。

したがって、基本的には、任意の頂点から開始し、BFSを実行して、遭遇した各頂点を最初の「島」のメンバーとしてマークします。次に、マークされていない次の頂点に移動して、BFSを再度実行します。今回は、2番目の「島」のメンバーとして、頂点にラベルを付けます。


4

有向グラフでは、部屋を頂点として描くことができます。そうすることで、よく知られたアルゴリズムを適用して問題を解決できるようになります。

たとえば、ダイクストラのアルゴリズムは、グラフ上の指定された開始頂点の最短パスツリーを生成します。このツリーには、開始点から到達可能なすべての頂点が含まれます。その後、ツリーに存在しない頂点が他の島の一部であると推測できます。これらの頂点にアルゴリズムを適用して、すべての島を表す木を取得できます。


1
無向グラフでさえそれを行います...あなたが一方通行の唯一のルートを持っていることを除いて。
Aron_dc '19年

@Aron_dc、そうです、部屋を無向グラフの頂点として描き、クラスカルのアルゴリズムを使用して同様の結果を得ることができます。petervazが接続を表す方法、つまりRoom 1> 3
Asakeron
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.