Ви можете розглядати кожну групу пов’язаних однакових символів (а маючи на увазі, я маю на увазі, що ви можете подорожувати від одного символу до іншого) окремим графіком . До кожного такого графіка застосуйте глибокий перший пошук (DFS), починаючи з кожного вузла в графіку, який вже не є частиною найдовшого шляху для цього графіка . Кожен раз, коли ви потрапляєте в глухий кут під час застосування DFS, перевірте, чи не пройшов шлях, який ви тільки що пройшли, більше, ніж глобальний максимум, який ви знайшли досі. Якщо він є, зберігайте його як новий найдовший шлях.
Ви помітите, що в попередньому пункті я згадав про застосування DFS кілька разів для кожного графа. Одного DFS, розміщеного на графіку, буде недостатньо. Розглянемо цей конкретний випадок:
1
1 1 1
1
1
1
1
Якби випадково ви вперше запустили DFS на цьому графіку в самому верхньому вузлі, ви виявите найдовший можливий шлях як вертикальний, але це було б не правильно. Це станеться кожного разу, коли ви запускаєте алгоритм DFS у вузлі, який знаходиться десь усередині отриманого шляху або зовсім не є його частиною. У цьому конкретному прикладі потрібно також запустити алгоритм DFS з самого лівого вузла у другому рядку. Це знайде правильний шлях. Взагалі кажучи, вам потрібно буде запустити алгоритми DFS у кожному вузлі, який наразі не є частиною найдовшого шляху для цього графіка, як зазначено вище.
Абсолютно гіршим сценарієм для цього алгоритму буде дошка, заповнена або здебільшого заповнена одним типом символів, однак, це навряд чи трапиться в грі. Також будьте уважні, як зберігаєте найдовші шляхи для кожного графіка. Якщо ви не оптимізуєте цей біт, можливо, вам буде краще просто викликати DFS для кожного вузла на сцені. Якщо припустити, що ви не працюєте з дуже великими дошками, і ця швидкість не є великою проблемою, це рішення повинно бути досить швидким.
Технічно кажучи, розбивши свою дошку на окремі графіки, у вас виникла декілька проблем " Найдовший шлях ". Як ми бачимо з вашого прикладу, ви можете мати цикли у своєму графіку (наприклад, що всі символи знаходяться на зовнішній стороні сцени одного типу), це означає, що в цій конкретній проблемі вам потрібно знайти найдовший шлях у декількох циклічних непрямих графіках, що неможливо зробити за многочлен .
Якщо ви виявите, що це занадто повільно, перегляньте цю відповідь на StackOverflow, щоб отримати докладнішу інформацію про те, як оптимізувати окремі "Найдовші проблеми на шляху".