Rilevamento di una sequenza di nodi in una griglia


12

Vista l'immagine qui sotto, devo rilevare la sequenza più ottimale sulla scheda (la linea verde). Le linee blu / rosse rappresentano possibili, ma non le mosse migliori.

Ecco le regole:

  1. Puoi passare a qualsiasi tessera che è la stessa, ed è il tuo vicino (la diagonale è valida)
  2. Dopo aver visitato una tessera, non è più possibile visitarla.

Ho pensato di passare in rassegna ciascun nodo e di guardare i suoi vicini, passando poi in modo ricorsivo. Una volta trovata una possibile mossa posso metterla in una struttura. Una volta trovate tutte le mosse possibili, seleziono semplicemente la mossa con il maggior numero di nodi. Diventa più difficile quando un nodo ha più di un vicino che corrisponde.

Quindi, c'è qualche algoritmo che posso usare? Stavo pensando a una sorta di alluvione, ma questo non soddisfa le regole # 2.

Come richiesto, ecco un video con un gameplay simile. http://youtube.com/watch?v=eumnCTG0AE8

inserisci qui la descrizione dell'immagine


Potrebbe essere importante notare che le 3 spade / oro sono possibili abbinamenti, ma non le ho incluse nell'immagine.

Perché le 3 spade / oro sono possibili abbinamenti? Vuoi trovare tutti i percorsi costituiti da almeno 3 elementi?
Bummzack,

sì, questa è l'idea.

Risposte:


6

Puoi considerare ogni gruppo di simboli identici collegati (e per collegamento intendo che puoi viaggiare da un simbolo all'altro) un grafico separato . Per ciascuno di questi grafici, applicare una prima ricerca della profondità (DFS) a partire da ciascun nodo del grafico che non fa già parte del percorso più lungo per quel grafico . Ogni volta che raggiungi un vicolo cieco durante l'applicazione di un DFS, controlla se il percorso che hai appena attraversato è più lungo del massimo globale che hai trovato finora. In tal caso, archiviarlo come nuovo percorso più lungo.

Noterai che nel paragrafo precedente ho menzionato l'applicazione di un DFS più volte per ciascun grafico. Un singolo DFS eseguito su un grafico non sarebbe sufficiente. Considera questo caso particolare:

    1
1 1 1
    1
    1
    1
    1

Se per caso avessi prima eseguito un DFS su questo grafico nel nodo più in alto, avresti scoperto il percorso più lungo possibile come linea verticale, ma ciò non sarebbe corretto. Ciò accadrebbe ogni volta che avvii l'algoritmo DFS in un nodo che si trova da qualche parte all'interno del percorso risultante o che non fa parte di esso. Quello che devi fare in questo esempio particolare è anche avviare un algoritmo DFS dal nodo più a sinistra nella seconda riga. Quello troverà il percorso corretto. In generale, dovrai eseguire algoritmi DFS in ciascun nodo che al momento non fa parte del percorso più lungo per quel grafico, come indicato sopra.

Lo scenario peggiore in assoluto per questo algoritmo sarebbe una scheda riempita o per lo più riempita con un singolo tipo di simbolo, tuttavia è improbabile che accada nel gioco. Inoltre, fai attenzione a come memorizzi i percorsi più lunghi per ciascun grafico. Se non ottimizzi questo bit, potresti fare meglio a chiamare un DFS per ogni nodo sullo stage. Supponendo che non lavori con schede molto grandi e che la velocità non sia un grosso problema, questa soluzione dovrebbe essere abbastanza veloce.

Tecnicamente parlando, scomponendo la tua scheda in grafici separati si finisce con più " Problemi di percorso più lungo ". Come possiamo vedere dal tuo esempio, puoi avere dei cicli nel tuo grafico (ad esempio, avendo tutti i simboli all'esterno dello stage dello stesso tipo), il che significa che in questo particolare problema devi trovare il percorso più lungo in diversi grafici ciclici non indirizzati, che non possono essere eseguiti in tempi polinomiali .

Se trovi che questo è troppo lento, vedi questa risposta su StackOverflow per maggiori dettagli su come ottimizzare i singoli "Problemi di percorso più lungo".

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.