11.4. ЛАБИРИНТ
677
варианта при правильном переходе (без прохода через закрытую дверь и без
повторов) в новую комнату. Если таких комнат несколько, то все следующие
комнаты могут быть упорядочены произвольно. Для определенности далее
выбирается такой порядок перебора: сначала проверяется возможность идти
налево, затем направо, вверх и, наконец, вниз. Если следующих вариантов
нет, то текущий вариант тупиковый, и нужно вернуться в предыдущую ком-
нату, чтобы попытаться выйти из нее в другую следующую комнату.
Для старого абстрактного представления каждый возможный вариант —
это значение построенной последовательности пар индексов (массив
Way
и переменная
Lway
), начальным значением которой является одноэлемент-
ная последовательность с индексами, указывающими на начальную комнату.
Следующие варианты строятся из текущего после проверки, в какие сосед-
ние комнаты можно пройти, в сочетании с упорядочиванием выбора очеред-
ной следующей комнаты, если их несколько (аналогично предыдущему). Во-
прос зацикливания решается за счет выставления ненулевых значений атри-
бута
Inf
элементов массива
Rooms
для комнат, которые уже посещались.
Нужно заметить, что стратегия преодоления зацикливания в принципе
может быть различна и, в частности, не обязательно связывать ее с помет-
ками комнат. Необходимо лишь позаботиться о том, чтобы каждый выстраи-
ваемый путь не пересекался. Для этого достаточно проверять тем или иным
способом, что в очередном варианте комната, намеченная для перехода, уже
представлена в текущем пути (в старом абстрактном представлении это легко
сделать, проверяя массив Way). Однако при таком решении окажется, что не-
которые из ком-нат будут посещаться неоднократно, поскольку информация
о том, что все пути из данной комнаты тупиковые, не запоминается. Именно
поэтому предпочтительнее оставлять пометки (ненулевые значения атрибу-
та
Inf
элементов массива
Rooms
) для комнат, которые уже исследованы. Это
решение верно для статических лабиринтов, т. е. таких, у которых состояние
открытия и закрытия дверей не меняется. В противном случае отмечать ту-
пиковые комнаты бесполезно (впрочем, если удастся ввести понятие полно-
стью исследованной комнаты, разумеется, зависящее от правил открывания
и закрывания дверей, то пометки таких комнат могут оказаться целесообраз-
ными).
Прямое решение задачи блуждания связывается с тем, что при переходе
от варианта к варианту текущее состояние программы запоминается полно-
стью. Все, что изменяется в ходе работы с вариантом, восстанавливается при
отказе от него. Иными словами, предлагается запоминать текущие значения
переменных абстрактного представления. Проще всего это делать через па-