Я пытаюсь решить слегка модифицированную версию проблемы Hamiltonian Path .Он изменен тем, что начальная и конечная точки даны нам, и вместо того, чтобы определять, существует ли решение, мы хотим найти число решений (которое может быть 0).
График представлен нам как двумерный массив, узлами которого являются элементы массива.Кроме того, мы можем двигаться только горизонтально или вертикально, а не по диагонали.Излишне говорить, что мы не можем перейти из одного города в два города, потому что для этого нам нужно посетить город дважды.
Я написал решение грубой силы, которое пробует все 4 (3 или 2 для узлов на ребрах) возможных ходов в каждом узле, а затем подсчитывает количество решений (то есть когда оно достигает цели и видит вседругие узлы тоже), но он работал на смешных отрезках времени на входах скромного размера (например, массив 7x7).
Я также подумал об использовании двунаправленного поиска , так как мы знаем цель, но это не очень помогло, так как мы не просто хотим, чтобы окантовки встретились, мы хотим такжечто все узлы были посещены.Более того, может случиться так, что когда все узлы будут исчерпаны между двумя полосами, они заканчиваются таким образом, что их невозможно соединить.
Я чувствую, что есть кое-что, чего я не знаю, что оставляет меня только с помощью грубой силы.Я знаю, что сама проблема является NP-полной, но мне интересно, есть ли какие-либо улучшения по сравнению с грубой силой.Может кто-нибудь предложить что-то еще?
- Правка -
Я упоминал, что использование двунаправленного поиска не очень помогает, и я хотел бы уточнить, почему я так думал.Рассмотрим граф 2x3 с верхним левым и нижним правым узлами, которые являются началом и целью соответственно.Пусть границы двунаправленного поиска перемещаются вправо от начала и влево от цели.После 2 ходов все узлы были бы посещены, но соединить полосы невозможно, так как мы можем идти только в одном направлении от одного узла.Однако, возможно, можно заставить алгоритм работать с некоторыми изменениями, как Дэвид указал в своем ответе ниже.