Ах, этот наш доблестный Робот! Представьте себе: маленький механический герой с девятью командами в арсенале, который пытается не только выжить в лабиринте из стен и проходов, но ещё и раскрасить внутренние стены прямоугольника так, чтобы ни один проход не пострадал.
Звучит как сюжет для научно-фантастического комедийного сериала, где каждый шаг – это испытание на прочность и смекалку.
Итак, у нашего Робота есть четыре основные команды-приказа: вверх, вниз, влево и вправо. Похоже на управление старой игрушечной машинкой, только если он вдруг решит пройти сквозь стену – бац!
– и капут. Как говорится, не пытайтесь повторить это дома. Чтобы избежать такой трагедии, Робот обладает ещё четырьмя командами проверки: свободно ли сверху? А снизу?
Слева? Справа?
Это как спросить у соседей по комнате: «Можно пройти?» Только тут соседи – это стены.
И вот начинается настоящая магия программирования с условием «если». Например: если справа свободно, то иди вправо и закрась клетку.
Очень просто и понятно. Но когда добавляются логические связки вроде «и», «или» и «не», ситуация становится похожа на семейный ужин с тёщей — все условия должны соблюдаться идеально, иначе беды не миновать.
Нашему Роботу предстоит непростая миссия: обойти прямоугольник из четырёх стен с двумя проходами (один в левой вертикальной стене и один в нижней горизонтальной), аккуратно закрасить все клетки вдоль внутренних сторон стен без закрашивания самих проходов.
И всё это на бесконечном поле! Кто бы мог подумать, что бесконечность может быть такой сложной задачей для маленького робота?
Робот начинает своё путешествие около нижнего конца левой стены, снаружи прямоугольника и чуть выше нижней стены. Задача звучит просто — но попробуйте повторить её после пары кружек кофе!
Ведь проходы могут быть где угодно (кроме углов), а размеры их неизвестны — настоящий вызов даже для опытного программиста.
Как сказал один мой знакомый программист после первой попытки написать этот алгоритм: «Я чувствую себя как Робинзон Крузо среди кода — пытаюсь построить плот из условий и циклов!» И правда, наш робот должен двигаться вверх вдоль левой стены пока справа есть стена (то есть пока он не дойдёт до верхнего края). Затем сделать шаг вправо — словно заглянуть за уголок — после чего продолжить движение вверх пока слева нет стены.
Тут важно не ошибиться: если идти слишком далеко или повернуть неправильно — привет разрушение!
Далее начинается веселье с циклами «пока» — наш робот закрашивает клетки сверху вниз или слева направо в зависимости от того, где находится стена. Представьте себе этого железного малютку с кисточкой вместо руки (ну или виртуальной кисточкой) аккуратно обходящего внутренний периметр прямоугольника.
Если бы он был человеком, я уверен: «Пожалуйста, не трогайте мои проходы!» стал бы его любимым лозунгом.
Кстати говоря, эта задача напоминает старую шутку про программиста: приходит он домой поздно ночью и говорит жене: «Не волнуйся, я написал программу обхода лабиринта». Жена отвечает: «Ты хотя бы знаешь куда идёшь?» На что программист спокойно отвечает: «Нет… но зато теперь знаю точно где стены».