Avendo un elenco di stanze con la loro connessione reciproca, come posso trovare gruppi di stanze isolate?


9

Sto cercando di creare un piccolo roguelike e sono andato fino a stanze e corridoi generatori casuali. Ogni stanza è un oggetto istanziato e contiene un arraylist delle altre stanze collegate da un corridoio.

Posso individuare le stanze non collegate, ma come posso sapere le stanze che sono collegate solo tra loro ma non alla maggior parte delle altre, formando un'isola?

per illustrare meglio il problema qui è un'immagine dalla console a livello impantanato. Le sale 5 e 6 sono collegate solo tra loro. Quale algoritmo posso usare per rilevarlo?

inserisci qui la descrizione dell'immagine


Problemi con l'utilizzo dell'immagine? Quel link pastebin durerà solo un mese.
MichaelHouse

Sì, all'inizio non ho capito bene cosa hai fatto qui. Mi dispiace, ho ripristinato la tua modifica.
Petervaz,

1
Perché non lo costruisci in modo che non ci siano stanze separate in primo luogo? O vuoi che ci siano set isolati?
AlbeyAmakiir,

@AlbeyAmakiir, come ho detto in un altro commento qui sotto, ho generato le stanze separatamente per tentativi ed errori fino a quando non riempio la mappa, solo allora eseguo una routine per connettermi, e poi ne eseguirò un'altra per collegare quelle isole. So che probabilmente è troppo contorto, ma non riuscivo a capire un altro modo.
Petervaz,

Risposte:


14

Inizia con un elenco completo di camere. Scegli una stanza di partenza. Navigare da quella stanza a tutte le stanze collegate. Per ogni camera si visita, rimuoverlo dalla lista delle stanze e aggiungerlo a un elenco A . Una volta che hai visitato tutte le connessioni, camere rimanenti nella lista non sono collegati alla sala di partenza o una qualsiasi delle camere nella lista A .

È quindi possibile continuare selezionando una stanza da ciò che resta dell'elenco completo e navigando di nuovo. Questa volta aggiungendo alla lista B . Continua questo processo fino a quando non hai più stanze nell'elenco originale. Ora hai elenchi di tutti i set di stanze collegati.

Problemi come questo si adattano facilmente ai problemi della teoria dei grafi. Ad esempio, il problema che hai descritto sopra riguarda direttamente la connettività .


1
qualsiasi algoritmo dell'albero di ricerca dovrebbe funzionare. Questo o potresti cambiare l'algoritmo di generazione per evitare questo problema. Se cambi l'algoritmo di generazione, generi semplicemente un numero casuale di stanze collegate alla tua stanza iniziale, quindi un numero casuale di stanze collegate a ciascuna delle seguenti, quindi puoi aggiungere alcune connessioni casuali tra stanze esistenti per ravvivare un po 'le cose con le scorciatoie e simili. Personalmente farei solo un algoritmo dell'albero di ricerca.
Benjamin Danger Johnson,

È molto logico. Devo essere stanco Grazie per l'aiuto. Accetterà non appena lo consente.
Petervaz,

@BenjaminDangerJohnson Il tuo commento sembra più appropriato per la domanda e non per questa risposta.
MichaelHouse

@petervaz Nessun problema. Immagino che la mia laurea in CS abbia i suoi usi dopo tutto.
MichaelHouse

@BenjaminDangerJohnson il mio algoritmo di generazione sta semplicemente posizionando stanze casuali fino a riempire lo spazio e cercare connessioni in seguito. = P Proverà a correggere le connessioni prima di ricorrere a modificare la creazione.
Petervaz,

9

La tua raccolta di stanze è essenzialmente un grafico e il tuo problema si riduce a trovare componenti collegati ("isole") in quel grafico.

Un modo semplice per trovare i componenti collegati è fare BFS (ricerca per ampiezza) da ciascun vertice. Fare BFS da un vertice A ti porterà tutti i vertici nel componente connesso a cui appartiene il vertice A.

Quindi, fondamentalmente, inizi con un vertice arbitrario, fai un BFS e contrassegni ogni vertice incontrato come membro della prima "isola". Quindi si passa al successivo vertice non contrassegnato e si esegue nuovamente un BFS, questa volta etichettando i vertici rilevati come membri della seconda "isola", e così via.


4

È possibile immaginare le stanze come vertici su un grafico diretto . In questo modo, sarai in grado di applicare algoritmi ben noti per risolvere il tuo problema.

L'algoritmo di Dijkstra , ad esempio, produce un albero di percorso più breve per un dato vertice iniziale su un grafico. Questo albero conterrà tutti i vertici raggiungibili dal punto di partenza. È quindi possibile dedurre che i vertici non presenti nella struttura fanno parte di altre isole. È possibile applicare l'algoritmo a questi vertici per ottenere alberi che rappresentano ogni isola.


1
Anche un grafico non indirizzato lo farebbe ... tranne per il fatto che hai solo percorsi a senso unico.
Aron_dc,

@Aron_dc, hai ragione, puoi immaginare le stanze come vertici su un grafico non orientato e ottenere risultati simili usando l'algoritmo di Kruskal. Ho solo suggerito di immaginarlo come grafici diretti a causa del modo in cui petervaz rappresentava le connessioni - cioè, Sala 1> 3
Asakeron,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.