Memiliki daftar kamar yang terhubung satu sama lain, bagaimana cara menemukan grup kamar yang terisolasi?

9

Saya mencoba membuat roguelike kecil dan pergi sejauh menghasilkan ruang acak dan koridor. Setiap kamar adalah objek yang dipasang dan berisi daftar susunan dari kamar lain yang dihubungkan oleh koridor.

Saya dapat memilih kamar yang tidak terhubung, tetapi bagaimana saya bisa tahu kamar-kamar yang terhubung hanya satu sama lain tetapi tidak untuk sebagian besar yang lain, membentuk sebuah pulau?

untuk diilustrasikan dengan lebih baik masalah di sini adalah gambar dari konsol pada tingkat macet. Kamar 5 dan 6 hanya terhubung satu sama lain. Algoritma apa yang dapat saya gunakan untuk mendeteksi itu?

masukkan deskripsi gambar di sini

petervaz
sumber
Ada masalah dengan menggunakan gambar? Tautan pastebin itu hanya akan bertahan sebulan.
MichaelHouse
Ya, pada awalnya saya tidak begitu mengerti apa yang Anda lakukan di sini. Maaf, saya mengembalikan perubahan Anda.
petervaz
1
Mengapa Anda tidak membangunnya sehingga tidak ada ruang terpisah di tempat pertama? Atau Anda ingin ada set terisolasi?
AlbeyAmakiir
@AlbeyAmakiir seperti yang saya katakan di komentar lain di bawah ini, saya membuat kamar secara terpisah dengan coba-coba sampai saya mengisi peta, hanya kemudian saya menjalankan rutin untuk menghubungkan, dan kemudian akan menjalankan yang lain untuk menghubungkan pulau-pulau itu. Saya tahu itu mungkin terlalu berbelit-belit tetapi tidak bisa mencari cara lain.
petervaz

Jawaban:

14

Mulailah dengan daftar kamar lengkap. Pilih ruang awal. Menavigasi dari kamar itu ke semua kamar yang terhubung. Untuk setiap kamar yang Anda kunjungi, menghapusnya dari daftar kamar dan menambahkannya ke daftar A . Setelah Anda telah mengunjungi semua koneksi Anda, setiap kamar yang tersisa dalam daftar tidak terhubung ke ruang awal atau salah satu kamar di daftar A .

Anda kemudian dapat melanjutkan dengan memilih kamar dari sisa daftar lengkap, dan menavigasi lagi. Kali ini menambah daftar B . Lanjutkan proses ini sampai Anda tidak memiliki kamar lagi di daftar asli. Anda sekarang memiliki daftar semua set kamar yang terhubung.

Masalah seperti ini mudah disesuaikan dengan masalah teori graf. Misalnya, masalah yang Anda jelaskan di atas berkaitan langsung dengan konektivitas .

MichaelHouse
sumber
1
algoritma pohon pencarian apa pun harus berfungsi. Itu atau Anda dapat mengubah algoritme pembangkitan Anda untuk menghindari masalah ini. Jika Anda mengubah algoritme pembangkitan Anda hanya menghasilkan jumlah acak kamar yang dilampirkan ke ruang awal Anda, maka jumlah acak kamar yang melekat pada masing-masing berikut, maka Anda dapat menambahkan beberapa koneksi acak antara kamar yang ada untuk sedikit membumbui hal-hal dengan cara pintas dan seperti. Secara pribadi saya hanya akan melakukan algoritma pohon pencarian sekalipun.
Benjamin Danger Johnson
Itu sangat logis. Saya pasti lelah. Terima kasih atas bantuan Anda. Akan menerima secepat mungkin.
petervaz
@BenjaminDangerJohnson Komentar Anda tampaknya lebih sesuai untuk pertanyaan dan bukan jawaban ini.
MichaelHouse
@petervaz Tidak masalah. Saya kira gelar CS saya memiliki kegunaannya setelah semua.
MichaelHouse
@BenjaminDangerJohnson algoritma pembangkit saya hanya menempatkan ruang acak sampai mengisi ruang dan mencari koneksi nanti. = P Akan mencoba memperbaiki koneksi sebelum beralih untuk mengubah kreasi.
petervaz
9

Koleksi kamar Anda pada dasarnya adalah sebuah grafik, dan masalah Anda bermuara pada menemukan komponen yang terhubung ("pulau") dalam grafik itu.

Cara sederhana untuk menemukan komponen yang terhubung adalah dengan melakukan BFS (pencarian pertama kali) dari setiap titik. Melakukan BFS dari simpul A akan membuat Anda mendapatkan semua simpul di komponen yang terhubung dengan simpul A.

Jadi, pada dasarnya, Anda mulai dengan titik sembarang, lakukan BFS dan tandai setiap titik yang ditemui sebagai anggota "pulau" pertama. Kemudian Anda beralih ke simpul tak bertanda berikutnya dan melakukan BFS lagi, kali ini pelabelan menemui simpul sebagai anggota "pulau" ke-2, dan seterusnya.


sumber
4

Anda dapat menggambarkan ruangan sebagai simpul pada grafik terarah . Dengan melakukan itu, Anda akan dapat menerapkan algoritma terkenal untuk menyelesaikan masalah Anda.

Algoritma Dijkstra , misalnya, menghasilkan pohon jalur terpendek untuk titik awal yang diberikan pada grafik. Pohon ini akan berisi semua simpul yang dapat dijangkau dari titik awal. Anda kemudian dapat menyimpulkan bahwa simpul yang tidak ada di pohon adalah bagian dari pulau lain. Anda dapat menerapkan algoritme pada simpul-simpul ini untuk mendapatkan pohon yang mewakili setiap pulau.

Asakeron
sumber
1
Bahkan grafik yang tidak terarah akan melakukannya ... kecuali Anda memiliki rute satu arah saja.
Aron_dc
@Aron_dc, Anda benar, Anda dapat membayangkan kamar sebagai simpul pada grafik yang tidak diarahkan dan mendapatkan hasil yang serupa dengan menggunakan algoritma Kruskal. Saya hanya menyarankan membayangkannya sebagai grafik terarah karena cara petervaz mewakili koneksi - yaitu, Kamar 1> 3
Asakeron