У меня была аналогичная проблема в одном из моих университетских Comp. Sci. курсы. Решение, которое мы придумали, состояло в том, чтобы следовать за левой стенкой (правая стенка будет работать так же хорошо). Вот какой-то псевдокод
While Not At End
If Square To Left is open,
Rotate Left
Go Forward
Else
Rotate Right
End If
Wend
Это в основном это. Сложная часть отслеживает, в каком направлении ваша сторона, и выяснить, какая позиция сетки находится слева от вас в зависимости от этого направления. Это сработало для любого тестового примера, с которым я столкнулся. Довольно интересно, что решение «Профессора» было чем-то вроде:
While Not At End
If Can Go North
Go North
ElseIf Can Go East
Go East
ElseIf Can Go South
Go South
ElseIf Can Go West
Go West
EndIf
Wend
. Это будет хорошо работать для большинства простых лабиринтов, но не работает в лабиринте, который выглядит следующим образом:
SXXXXXXXXXXXXX
X X
X X
X X
XXX X
X X X
X XXXXXXXXXXX XXXE
X X
XXXXXXXXXXXXXXXXXXX
Когда S и E являются началом и концом.
С чем-либо, что не следует за стеной, вам нужно сохранить список мест, где вы были, чтобы вы могли вернуться в случае необходимости, когда вы впадаете в тупик, и поэтому что вы не попадаете в петлю. Если вы будете следовать за стеной, вам не нужно отслеживать, где вы были. Хотя вы не найдете наиболее оптимальный путь через лабиринт, вы всегда сможете пройти через него.