Рассмотрим карточную игру по типу пасьянса «Башня», «Трипикс» или «Пасьянс в фарватере»: стол состоит из некоторого количества карт, которые доступны сразу, каждая из которых может покрывать другие карты под ней (блокируя их от игры) , У вас есть одна «базовая» карта, и вы можете удалить карту со стола, если она ровно на один ранг выше или ниже вашей базовой карты, после чего она становится вашей новой базовой картой. У вас есть ограниченное количество карт для замены, когда вы не можете разыграть карту со стола, поэтому обычно вы хотите разыграть самую длинную последовательность карт.
Во-первых, как бы вы представили правление, чтобы облегчить поиск решения? Во-вторых, какой алгоритм вы бы использовали, чтобы найти самую длинную воспроизводимую последовательность?
Пример:
-4a- -5-
-3- -2- -4b-
Карты на нижних блок-картах сверху не извлекаются: вы не можете удалить 4a, пока не исчезнут и 3, и 2. Предполагая, что ваша стартовая карта - туз, оптимальная игра здесь будет 2, 3, 4b, 5, 4a. (Вместо этого можно сыграть 2, 3, 4а, но это не так хорошо.)
Полагаю, это должно быть представлено как некий ориентированный граф. У вас будут ребра от 3 и 2 до 4a и от 2 и 4b до 5, но будут ли у вас ребра от 3 до 2 и от 4a до 5, так как одно играбельно после другого? Если это так, будет ли тот факт, что они могут быть воспроизведены в любом порядке (3, затем 2, или 2, а затем 3), сформировать цикл в графе, который не позволяет использовать эффективные алгоритмы «самого длинного пути»? (Я считаю, что нахождение самого длинного пути в графе является NP-полным, если граф содержит циклы.)