Я работаю над этим пару дней безуспешно. По сути, у меня есть куча узлов, расположенных в 2D матрице. Каждый узел имеет четыре соседа, за исключением узлов по сторонам и углам матрицы, которые имеют 3 и 2 соседа соответственно. Представьте себе кучу квадратных карт, разложенных бок о бок в прямоугольной области - проект фактически имитирует своего рода карточную / настольную игру.
Каждый узел может или не может быть связан с узлами вокруг него. У каждого узла есть функция (get_connections ()), которая немедленно возвращает узлы вокруг него, к которому он подключен (поэтому возвращается от 0 до 4 узлов). Каждый узел также имеет свойство «index», которое содержит его положение на матрице платы (например, «1, 4» -> строка 1, столбец 4). То, что я пытаюсь сделать, - это найти самый длинный неповторяющийся путь из соединенных узлов, заданный конкретным «начальным» узлом.
Я загрузил пару изображений, которые должны дать хорошее представление о том, что я пытаюсь сделать:
![www.necessarygames.com/junk/10-days-problem-01.jpg](https://i.stack.imgur.com/GgUYz.jpg)
(источник: requiredgames.com )
![www.necessarygames.com/junk/10-days-problem-02.jpg](https://i.stack.imgur.com/JqByc.jpg)
(источник: requiredgames.com )
На обоих изображениях выделенные красные карточки предположительно являются самым длинным путем из соединенных карточек, содержащих самую верхнюю левую карточку. Однако на обоих изображениях видно, что пара карт, которые должны быть на пути, были опущены (Румыния и Мальдова на первом изображении, Греция и Турция на втором)
Вот рекурсивная функция, которую я сейчас использую, чтобы найти самый длинный путь, учитывая начальный узел / карту:
def get_longest_trip(self, board, processed_connections = list(),
processed_countries = list()):
#Append this country to the processed countries list,
#so we don't re-double over it
processed_countries.append(self)
possible_trips = dict()
if self.get_connections(board):
for i, card in enumerate(self.get_connections(board)):
if card not in processed_countries:
processed_connections.append((self, card))
possible_trips[i] = card.get_longest_trip(board,
processed_connections,
processed_countries)
if possible_trips:
longest_trip = []
for i, trip in possible_trips.iteritems():
trip_length = len(trip)
if trip_length > len(longest_trip):
longest_trip = trip
longest_trip.append(self)
return longest_trip
else:
print
card_list = []
card_list.append(self)
return card_list
else:
#If no connections from start_card, just return the start card
#as the longest trip
card_list = []
card_list.append(board.start_card)
return card_list
Проблема здесь связана со списком processing_countries: если вы посмотрите на мой первый скриншот, вы увидите, что произошло то, что, когда Украина обошла, она посмотрела на два возможных варианта для самого длинного пути (Мальдова-Румыния или Турция, Болгария), увидели, что они оба равны, и выбрали одного без разбора. Теперь, когда Венгрия приходит в себя, она не может пытаться проложить путь через Румынию (где на самом деле будет самый длинный путь), потому что Румыния была добавлена Украиной в список обработанных стран.
Любая помощь в этом чрезвычайно приветствуется. Если вы найдете мне решение этой проблемы, рекурсивное или нет, я с радостью пожертвую вам $$.
Я загрузил полный исходный код (требуется Python 2.6, Pygame 1.9) в:
http://www.necessarygames.com/junk/planes_trains.zip
Соответствующий код находится в файле src / main.py, который настроен на запуск.