Виявлення послідовності вузлів у сітці


12

З огляду на зображення нижче, мені потрібно виявити найоптимальнішу послідовність на дошці (зелена лінія). Сині / червоні лінії представляють можливі, але не найкращі рухи.

Ось правила:

  1. Ви можете перейти на будь-яку плитку, яка є однаковою, і є вашим сусідом (діагональ дійсна)
  2. Відвідавши плитку, ви більше не можете її відвідати.

Я подумав про прокручування кожного вузла і перегляд його сусідів, а потім рекурсивно проходження. Як тільки я знайду можливий хід, я можу вкласти його в структуру. Коли всі можливі рухи будуть знайдені, я просто вибираю ходу з найбільшою кількістю вузлів. Це стає складніше, коли у вузла є більше одного сусіда, який відповідає.

Отже, чи є якийсь алгоритм, який я можу використовувати? Я думав про якусь заливку, але це не відповідає правилам №2.

За запитом, ось відео подібного геймплея. http://youtube.com/watch?v=eumnCTG0AE8

введіть тут опис зображення


Можливо, важливо зазначити, що 3 мечі / золото - це можливі сірники, але я просто не включив їх у зображення.

Чому можливі 3 мечі / золото? Ви хочете знайти всі шляхи, які складаються щонайменше з 3 елементів?
bummzack

так, це ідея.

Відповіді:


6

Ви можете розглядати кожну групу пов’язаних однакових символів (а маючи на увазі, я маю на увазі, що ви можете подорожувати від одного символу до іншого) окремим графіком . До кожного такого графіка застосуйте глибокий перший пошук (DFS), починаючи з кожного вузла в графіку, який вже не є частиною найдовшого шляху для цього графіка . Кожен раз, коли ви потрапляєте в глухий кут під час застосування DFS, перевірте, чи не пройшов шлях, який ви тільки що пройшли, більше, ніж глобальний максимум, який ви знайшли досі. Якщо він є, зберігайте його як новий найдовший шлях.

Ви помітите, що в попередньому пункті я згадав про застосування DFS кілька разів для кожного графа. Одного DFS, розміщеного на графіку, буде недостатньо. Розглянемо цей конкретний випадок:

    1
1 1 1
    1
    1
    1
    1

Якби випадково ви вперше запустили DFS на цьому графіку в самому верхньому вузлі, ви виявите найдовший можливий шлях як вертикальний, але це було б не правильно. Це станеться кожного разу, коли ви запускаєте алгоритм DFS у вузлі, який знаходиться десь усередині отриманого шляху або зовсім не є його частиною. У цьому конкретному прикладі потрібно також запустити алгоритм DFS з самого лівого вузла у другому рядку. Це знайде правильний шлях. Взагалі кажучи, вам потрібно буде запустити алгоритми DFS у кожному вузлі, який наразі не є частиною найдовшого шляху для цього графіка, як зазначено вище.

Абсолютно гіршим сценарієм для цього алгоритму буде дошка, заповнена або здебільшого заповнена одним типом символів, однак, це навряд чи трапиться в грі. Також будьте уважні, як зберігаєте найдовші шляхи для кожного графіка. Якщо ви не оптимізуєте цей біт, можливо, вам буде краще просто викликати DFS для кожного вузла на сцені. Якщо припустити, що ви не працюєте з дуже великими дошками, і ця швидкість не є великою проблемою, це рішення повинно бути досить швидким.

Технічно кажучи, розбивши свою дошку на окремі графіки, у вас виникла декілька проблем " Найдовший шлях ". Як ми бачимо з вашого прикладу, ви можете мати цикли у своєму графіку (наприклад, що всі символи знаходяться на зовнішній стороні сцени одного типу), це означає, що в цій конкретній проблемі вам потрібно знайти найдовший шлях у декількох циклічних непрямих графіках, що неможливо зробити за многочлен .

Якщо ви виявите, що це занадто повільно, перегляньте цю відповідь на StackOverflow, щоб отримати докладнішу інформацію про те, як оптимізувати окремі "Найдовші проблеми на шляху".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.