Birbirlerine bağlantısı olan odaların bir listesine sahipken, izole oda gruplarını nasıl bulabilirim?


9

Küçük bir roguelike oluşturmaya çalışıyorum ve rastgele üreten odalar ve koridorlar kadar ileri gittim. Her oda anlık bir nesnedir ve bir koridorla birbirine bağlanan diğer odalardan oluşan bir dizici içerir.

Bağlantısız odaları seçebilirim ama sadece birbirine bağlı olan ama diğerlerinin çoğuna bağlı olmayan, bir ada oluşturan odaları nasıl bilebilirim?

daha iyi açıklamak gerekirse, buradaki sorun konsoldan düzensiz bir görüntü. Odalar 5 ve 6 sadece birbirine bağlıdır. Bunu tespit etmek için hangi algoritmayı kullanabilirim?

resim açıklamasını buraya girin


Resmi kullanmada sorun mu yaşıyorsunuz? Bu pastebin bağlantısı sadece bir ay sürecek.
MichaelHouse

Evet, ilk başta burada ne yaptığını tam olarak anlamadım. Üzgünüm, değişikliğinizi geri aldım.
petervaz

1
Neden ilk etapta ayrı oda olmayacak şekilde inşa etmiyorsunuz ? Yoksa izole setler olmasını ister misiniz?
AlbeyAmakiir

@AlbeyAmakiir, aşağıda başka bir yorumda söylediğim gibi, haritayı doldurana kadar odaları deneme yanılma yoluyla ayrı ayrı oluşturuyorum, ancak o zaman bağlanmak için bir rutin çalıştırıyorum ve daha sonra bu adaları bağlamak için başka bir tane çalıştıracağım. Muhtemelen çok kıvrımlı olduğunu biliyorum ama başka bir şekilde anlayamadım.
petervaz

Yanıtlar:


14

Odaların tam listesi ile başlayın. Bir başlangıç ​​odası seçin. O odadan tüm bağlı odalara gidin. Ziyaret ettiğiniz her oda için oda listesinden kaldırın ve A listesine ekleyin . Tüm bağlantılarınızı ziyaret ettikten sonra, listede kalan odalar başlangıç ​​odasına veya A listesindeki odalardan herhangi birine bağlı değildir. .

Daha sonra tam listenin geri kalanından bir oda seçip tekrar dolaşarak devam edebilirsiniz. Bu sefer listeye ekleme B . Orijinal listede yer kalmayıncaya kadar bu işleme devam edin. Artık bağlı tüm oda setlerinin listelerine sahipsiniz.

Bunun gibi problemler grafik teorisi problemlerine kolayca uyarlanabilir. Örneğin, yukarıda tanımladığınız sorun doğrudan bağlantıyla ilgilidir .


1
herhangi bir arama ağacı algoritması çalışmalıdır. Bu ya da bu sorunu önlemek için nesil algoritmanızı değiştirebilirsiniz. Üretim algoritmanızı değiştirirseniz, başlangıç ​​odanıza bağlı rastgele sayıda oda, daha sonra aşağıdakilerin her birine bağlı rastgele sayıda oda oluşturursanız, işleri kısayollarla biraz renklendirmek için mevcut odalar arasında rastgele bağlantılar ekleyebilirsiniz. ve benzeri. Şahsen ben sadece bir arama ağacı algoritması yapmak istiyorum.
Benjamin Danger Johnson

Bu çok mantıklı. Yorgun olmalıyım. Yardımın için teşekkürler. İzin verir vermez kabul eder.
petervaz

@BenjaminDangerJohnson Yorumunuz bu cevap için değil, soru için daha uygun görünüyor.
MichaelHouse

@petervaz Sorun yok. Ne de olsa CS derecemin yararları var sanırım.
MichaelHouse

@BenjaminDangerJohnson benim üreten algoritma sadece boşluk doldurmak ve daha sonra bağlantıları aramak kadar rastgele oda yerleştiriyor. = P Oluşturmayı değiştirmek için başvurmadan önce bağlantıları düzeltmeye çalışacaktır.
petervaz

9

Oda koleksiyonunuz aslında bir grafiktir ve probleminiz bu grafikte bağlı bileşenleri ("adalar") bulmakla ilgilidir .

Bağlı bileşenleri bulmanın basit bir yolu , her bir tepe noktasından BFS (önce genişlik arama) yapmaktır . Bir tepe noktasından BFS yapmak, bağlı bileşendeki A tepe noktasının ait olduğu tüm köşeleri elde etmenizi sağlar.

Yani, temelde, rastgele bir tepe noktasıyla başlarsınız, bir BFS yaparsınız ve karşılaşılan her tepe noktasını 1. "adanın" üyesi olarak işaretlersiniz. Sonra bir sonraki işaretlenmemiş tepe noktasına geçip tekrar bir BFS yaparsınız, bu sefer karşılaşılan köşeleri 2. "adanın" üyeleri olarak etiketleme vb.


4

Odaları yönlendirilmiş bir grafikte köşe noktaları olarak görüntüleyebilirsiniz . Bunu yaparak, probleminizi çözmek için iyi bilinen algoritmalar uygulayabilirsiniz.

Örneğin Dijkstra'nın algoritması , grafik üzerinde belirli bir başlangıç ​​tepe noktası için en kısa yol ağacı üretir . Bu ağaç, başlangıç ​​noktasından erişilebilen tüm köşeleri içerecektir. Daha sonra ağaçta bulunmayan köşelerin diğer adaların bir parçası olduğunu çıkarabilirsiniz. Her adayı temsil eden ağaçları elde etmek için algoritmayı bu köşelere uygulayabilirsiniz.


1
Yönlendirilmemiş bir grafik bile bunu yapardı ... tek yolunuz var.
Aron_dc

@Aron_dc, haklısın, odaları yönlendirilmemiş bir grafikte köşeler olarak resmedebilir ve Kruskal'ın algoritmasını kullanarak benzer sonuçlar elde edebilirsiniz. Petervaz'ın bağlantıları temsil etme şekli nedeniyle yönlendirilmiş grafikler olarak göstermeyi önerdim - yani, Oda 1> 3
Asakeron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.