Teniendo una lista de habitaciones con sus conexiones entre sí, ¿cómo encuentro grupos de habitaciones aisladas?

9

Estoy tratando de crear un pequeño roguelike y fui tan lejos como al azar generando habitaciones y corredores. Cada habitación es un objeto instanciado y contiene una lista de las otras habitaciones conectadas por un pasillo.

Puedo seleccionar habitaciones que no están conectadas, pero ¿cómo puedo saber las habitaciones que están conectadas entre sí pero no con la mayoría de los demás, formando una isla?

Para ilustrar mejor el problema aquí es una imagen de la consola en un nivel empantanado. Las habitaciones 5 y 6 están conectadas solo entre sí. ¿Qué algoritmo puedo usar para detectar eso?

ingrese la descripción de la imagen aquí

Petervaz
fuente
Problema con el uso de la imagen? Ese enlace pastebin solo durará un mes.
MichaelHouse
Sí, al principio no entendí lo que hiciste aquí. Lo siento, revertí tu cambio.
petervaz
1
¿Por qué no lo construyes para que no pueda haber habitaciones separadas en primer lugar? ¿O quieres que haya conjuntos aislados?
AlbeyAmakiir
@AlbeyAmakiir, como dije en otro comentario a continuación, genero las habitaciones por separado por prueba y error hasta que llene el mapa, solo entonces ejecuto una rutina para conectarme y luego ejecutaré otra para conectar esas islas. Sé que probablemente sea demasiado complicado pero no podría pensar de otra manera.
petervaz

Respuestas:

14

Comience con una lista completa de habitaciones. Elige una sala de partida. Navega desde esa habitación a todas las habitaciones conectadas. Para cada habitación que visita, quitarlo de la lista de salas y añadirlo a una lista A . Una vez que usted ha visitado todas las conexiones, las habitaciones restantes en la lista no están conectados a la sala de partida o de cualquiera de las habitaciones en la lista A .

Luego puede continuar seleccionando una habitación de lo que queda de la lista completa y navegando nuevamente. Esta vez añadiendo a la lista B . Continúe este proceso hasta que no tenga más habitaciones en la lista original. Ahora tiene listas de todos los conjuntos de habitaciones conectadas.

Problemas como este se adaptan fácilmente a los problemas de la teoría de grafos. Por ejemplo, el problema que ha descrito anteriormente se relaciona directamente con la conectividad .

MichaelHouse
fuente
1
cualquier algoritmo de árbol de búsqueda debería funcionar. Eso o podría cambiar su algoritmo de generación para evitar este problema. Si cambia su algoritmo de generación solo genera un número aleatorio de habitaciones conectadas a su sala de inicio, luego una cantidad aleatoria de habitaciones conectadas a cada uno de los siguientes, entonces puede agregar algunas conexiones aleatorias entre las salas existentes para condimentar un poco las cosas con atajos y tal. Sin embargo, personalmente solo haría un algoritmo de árbol de búsqueda.
Benjamin Danger Johnson
Eso es muy lógico. Debo estar cansado. Gracias por tu ayuda. Aceptará tan pronto como lo permita.
petervaz
@BenjaminDangerJohnson Su comentario parece más apropiado para la pregunta y no para esta respuesta.
MichaelHouse
@petervaz No hay problema. Supongo que mi título de CS tiene sus usos después de todo.
MichaelHouse
@BenjaminDangerJohnson mi algoritmo de generación es simplemente colocar habitaciones aleatorias hasta llenar el espacio y buscar conexiones más tarde. = P Intentará arreglar las conexiones antes de recurrir a cambiar la creación.
petervaz
9

Su colección de habitaciones es esencialmente un gráfico, y su problema se reduce a encontrar los componentes conectados ("islas") en ese gráfico.

Una manera simple de encontrar componentes conectados es hacer BFS (búsqueda de amplitud) desde cada vértice. Hacer BFS desde un vértice A te dará todos los vértices en el componente conectado al que pertenece el vértice A.

Entonces, básicamente, comienza con un vértice arbitrario, realiza un BFS y marca cada vértice encontrado como miembro de la primera "isla". Luego pasa al siguiente vértice sin marcar y vuelve a hacer un BFS, esta vez el etiquetado encontró vértices como miembros de la segunda "isla", y así sucesivamente.


fuente
4

Puedes imaginar las habitaciones como vértices en un gráfico dirigido . Al hacerlo, podrá aplicar algoritmos bien conocidos para resolver su problema.

El algoritmo de Dijkstra , por ejemplo, produce un árbol de ruta más corto para un vértice inicial dado en un gráfico. Este árbol contendrá todos los vértices alcanzables desde el punto de partida. Luego puede deducir que los vértices que no están presentes en el árbol son parte de otras islas. Puede aplicar el algoritmo a estos vértices para obtener árboles que representen cada isla.

Asakeron
fuente
1
Incluso un gráfico no dirigido lo haría ... excepto que tiene rutas de un solo sentido.
Aron_dc
@Aron_dc, tiene razón, puede visualizar las habitaciones como vértices en un gráfico no dirigido y obtener resultados similares utilizando el algoritmo de Kruskal. Solo sugerí representarlo como gráficos dirigidos debido a la forma en que petervaz representaba las conexiones, es decir, Sala 1> 3
Asakeron el