Это должен быть довольно простой алгоритм для реализации.
Для начала разделите дороги на отдельные группы, где все сегменты дороги в каждом наборе так или иначе связаны между собой.Существуют различные способы сделать это, но вот один из них:
- Выберите случайный участок дороги, добавьте его в набор и отметьте его
- Ветка от этого сегмента, т.е.следуйте за соединенными сегментами в обоих направлениях, которые не отмечены (если они отмечены, мы уже были здесь)
- Если найденного сегмента дороги еще нет в наборе, добавьте его и отметьте его
- Продолжайте переходить от новых сегментов до тех пор, пока вы не сможете найти больше немаркированных сегментов, которые связаны с теми, которые в настоящее время находятся в наборе
- Если остались немаркированные сегменты, они являются частью нового набора, выберите случайныйодин и начать с 1 с другим набором
Примечание : Согласно официальным Правилам Катана , дорога может быть нарушена, если другая игра строит поселениена стыке между двумя сегментами.Вы должны обнаружить это, а не проходить мимо населенного пункта.
Обратите внимание, что в приведенных выше и последующих шагах учитываются только текущие сегменты игроков.Вы можете игнорировать эти другие сегменты, как если бы они даже не были на карте.
Это дает вам один или несколько наборов, каждый из которых содержит один или несколько сегментов дороги.
Хорошо, для каждого наборавыполните следующие действия:
- Выберите случайный сегмент дороги из набора, в котором есть только один связанный сегмент дороги (т. е. вы выбираете конечную точку)
- Если вы можете 'Если это сделать, то весь набор будет зацикливаться (один или несколько), поэтому выберите случайный сегмент в этом случае
Теперь из выбранного сегмента выполните рекурсивное разветвление поиска в глубину, отслеживая длину текущей дороги, которую вы нашли до сих пор.Также всегда отмечайте участки дороги и не разветвляйте на уже отмеченные участки.Это позволит алгоритму остановиться, когда он «съест свой хвост».
Всякий раз, когда вам нужно вернуться назад, потому что нет больше ветвей, запишите текущую длину, и если она длиннее, чем«предыдущий максимум», сохраните новую длину как максимальную.
Сделайте это для всех подходов, и у вас будет самая длинная дорога.