662
ГЛАВА 11. МЕТОДЫ, ОСНОВАННЫЕ НА РЕКУРСИИ
борной задачей, требующей просмотра вариантов с возвратами. Во-вторых, в
ней легко усмотреть связь с задачей закраски области (§ 11.2). Попытка при-
менить уже наработанный подход к решению оказывается поучительной. В-
третьих, на примере данной задачи можно проследить один важный техно-
логический подход к решению программистских задач, связанный с разбие-
нием задачи на подзадачи.
11.4.1. Блуждание по лабиринту и закраска области
Задача закраски области может быть достаточно просто переформулиро-
вана для случая блуждания по лабиринту, когда требуется найти все точки
области, достижимые из заданной точки. В такой постановке новая задача
допускает решение, ничем не отличающееся от решения задачи о закраске.
В самом деле, возможность перехода из одной точки лабиринта в другую пол-
ностью соответствует понятию соседства точек,и как следствие,закраску со-
седней точки можно трактовать как переход в нее, а осуществление закраски
всей области — как отметку всех последовательно достижимых точек. Од-
нако если слегка изменить постановку задачи блуждания, потребовав опре-
делить не существование пути, а сам путь из одной точки в другую, то об-
наружится, что алгоритм закраски области потребует корректировки. Кстати
сказать, новая постановка более естественна для задачи блуждания.
Почему для нахождения пути из одной точки в другую подход, предста-
вленный в предыдущем разделе, не годится? Дело в том, что он не фиксирует
последовательности перемещений по точкам, более того, для закраски прин-
ципиально, что одна и та же точка посещается не один раз, а столько, сколько
нужно для закраски всех соседствующих с ней точек. При решении новой же
задачи нужно научиться отвергать (исключать из рассмотрения) точки, пере-
ходы из которых ведут в тупики (не только зацикливание). В прежней задаче
отвергались лишь граничные точки, что сохраняется и для задачи блужда-
ния, и те точки, соседи которых лежат на границе области или уже закраше-
ны. Иными словами, определить, нужна ли конкретная точка для продолже-
ния процесса (для рекурсивного вызова процедуры), можно было локально.
Теперь же, составляя последовательность точек (последовательности, если
требуется найти разные пути), представляющей искомый путь (пути), отвер-
гать точки нужно после исследования, ведет ли из нее путь в точку назначе-
ния. Весьма поучительно попробовать попытаться воспользоваться прежним
алгоритмом для решения данной задачи непосредственно и увидеть его де-
фекты.
Есть еще одна особенность новой задачи, важная уже на уровне уточ-