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".