Ayant une liste de chambres avec leur connexion les unes aux autres, comment trouver des groupes de chambres isolés?

9

J'essaie de créer un petit roguelike et je suis allé jusqu'à des salles et des couloirs de génération aléatoire. Chaque pièce est un objet instancié et contient une liste des autres pièces reliées par un couloir.

Je peux distinguer des pièces non connectées mais comment puis-je connaître les pièces qui ne sont reliées entre elles mais pas à la plupart des autres, formant une île?

pour mieux illustrer le problème voici une image de la console à un niveau enlisé. Les chambres 5 et 6 sont connectées uniquement entre elles. Quel algorithme puis-je utiliser pour détecter cela?

entrez la description de l'image ici

petervaz
la source
Un problème avec l'utilisation de l'image? Ce lien pastebin ne durera qu'un mois.
MichaelHouse
Ouais, je ne comprenais pas très bien au début ce que tu as fait ici. Désolé, j'ai annulé votre changement.
petervaz
1
Pourquoi ne le construisez-vous pas pour qu'il ne puisse pas y avoir de pièces séparées en premier lieu? Ou voulez-vous qu'il y ait des ensembles isolés?
AlbeyAmakiir
@AlbeyAmakiir, comme je l'ai dit dans un autre commentaire ci-dessous, je génère les chambres séparément par essais et erreurs jusqu'à ce que je remplisse la carte, puis j'exécute une routine pour se connecter, puis j'exécute une autre pour connecter ces îles. Je sais que c'est probablement trop compliqué, mais je ne pouvais pas trouver une autre façon.
petervaz

Réponses:

14

Commencez avec une liste complète des chambres. Choisissez une salle de départ. Naviguez de cette pièce vers toutes les pièces connectées. Pour chaque pièce que vous visitez, retirez- la de la liste des chambres et l' ajouter à la liste A . Une fois que vous avez visité toutes vos connexions, les chambres restantes sur la liste ne sont pas connectés à la salle de départ ou l' une des chambres sur la liste A .

Vous pouvez ensuite continuer en sélectionnant une pièce dans ce qui reste de la liste complète et en naviguant à nouveau. Cette fois -ci d' ajouter à la liste B . Continuez ce processus jusqu'à ce que vous n'ayez plus de chambres sur la liste d'origine. Vous avez maintenant des listes de tous les ensembles de pièces connectés.

Des problèmes comme celui-ci sont facilement adaptés aux problèmes de théorie des graphes. Par exemple, le problème que vous avez décrit ci-dessus est directement lié à la connectivité .

MichaelHouse
la source
1
tout algorithme d'arbre de recherche devrait fonctionner. Cela ou vous pourriez changer votre algorithme de génération pour éviter ce problème. Si vous changez votre algorithme de génération, générez simplement un nombre aléatoire de pièces attachées à votre salle de départ, puis un nombre aléatoire de pièces attachées à chacun des éléments suivants, alors vous pouvez ajouter des connexions aléatoires entre les pièces existantes pour pimenter un peu les choses avec des raccourcis et autres choses de ce genre. Personnellement, je ferais juste un algorithme d'arbre de recherche.
Benjamin Danger Johnson
C'est très logique. Je dois être fatigué. Merci de votre aide. Acceptera dès qu'il le permettra.
petervaz
@BenjaminDangerJohnson Votre commentaire semble plus approprié pour la question et non pour cette réponse.
MichaelHouse
@petervaz Aucun problème. Je suppose que mon diplôme CS a ses utilisations après tout.
MichaelHouse
@BenjaminDangerJohnson mon algorithme de génération place simplement des pièces aléatoires jusqu'à remplir l'espace et recherche des connexions plus tard. = P va essayer de réparer les connexions avant de recourir pour changer la création.
petervaz
9

Votre collection de pièces est essentiellement un graphique, et votre problème se résume à trouver des composants connectés ("îles") dans ce graphique.

Un moyen simple de trouver des composants connectés consiste à effectuer une BFS (recherche en largeur d'abord) à partir de chaque sommet. Faire BFS à partir d'un sommet A vous obtiendra tous les sommets du composant connecté auquel le sommet A appartient.

Donc, fondamentalement, vous commencez avec un sommet arbitraire, effectuez un BFS et marquez chaque sommet rencontré comme membre du 1er "îlot". Ensuite, vous passez au prochain sommet non marqué et effectuez à nouveau un BFS, cette fois en étiquetant les sommets rencontrés en tant que membres du 2e "îlot", et ainsi de suite.


la source
4

Vous pouvez imaginer les chambres comme sommets sur un graphique orienté . En faisant cela, vous pourrez appliquer des algorithmes bien connus pour résoudre votre problème.

L'algorithme de Dijkstra , par exemple, produit un arbre de chemin le plus court pour un sommet de départ donné sur un graphique. Cet arbre contiendra tous les sommets accessibles depuis le point de départ. Vous pouvez alors en déduire que les sommets non présents dans l'arbre font partie d'autres îles. Vous pouvez appliquer l'algorithme à ces sommets afin d'obtenir des arbres représentant chaque île.

Asakeron
la source
1
Même un graphique non orienté le ferait ... sauf que vous n'avez que des routes à sens unique.
Aron_dc
@Aron_dc, vous avez raison, vous pouvez représenter les pièces sous forme de sommets sur un graphique non orienté et obtenir des résultats similaires en utilisant l'algorithme de Kruskal. Je viens de suggérer de le représenter sous forme de graphiques dirigés en raison de la façon dont petervaz représentait les connexions - c.-à-d. Salle 1> 3
Asakeron