Задание №15 — Алгоритмы и программирование
Исполнитель Робот умеет перемещаться по лабиринту, начерченному на плоскости, разбитой на клетки. Между соседними (по сторонам) клетками может стоять стена, через которую Робот пройти не может.
У Робота есть девять команд. Четыре команды это команды-приказы:
вверх вниз влево вправо
При выполнении любой из этих команд Робот перемещается на одну клетку соответственно: вверх ↑, вниз ↓, влево ←, вправо →. Если Робот получит команду передвижения сквозь стену, то он разрушится.
Также у Робота есть команда закрасить, при которой закрашивается клетка, в которой Робот находится в настоящий момент.
Ещё четыре команды это команды проверки условий. Эти команды проверяют, свободен ли путь для Робота в каждом из четырёх возможных направлений:
сверху свободно снизу свободно слева свободно справа свободно
Эти команды можно использовать вместе с условием «eсли», имеющим следующий вид:
если условие то
последовательность команд
все
Здесь условие одна из команд проверки условия.
Последовательность команд это одна или несколько любых команд-приказов.
Например, для передвижения на одну клетку вправо, если справа нет стенки, и закрашивания клетки можно использовать такой алгоритм:
если справа свободно то
вправо
закрасить
все
В одном условии можно использовать несколько команд проверки условий, применяя логические связки и, или, не, например:
если (справа свободно) и (не снизу свободно) то
вправо
все
Для повторения последовательности команд можно использовать цикл «пока», имеющий следующий вид:
нц пока условие
последовательность команд
кц
Например, для движения вправо, пока это возможно, можно использовать следующий алгоритм:
нц пока справа свободно
вправо
кц
Выполните задание.
На бесконечном поле имеются четыре стены, соединённые между собой, которые образуют прямоугольник. Длины стен неизвестны. В левой вертикальной стене есть ровно один проход, в нижней горизонтальной стене также есть ровно один проход. Проход не может примыкать к углу прямоугольника. Точные места проходов и ширина проходов неизвестны. Робот находится около нижнего конца левой вертикальной стены, снаружи прямоугольника и выше нижней стены.
На рисунке указан один из возможных способов расположения стен и Робота (Робот обозначен буквой «Р»).

Напишите для Робота алгоритм, закрашивающий все клетки, расположенные вдоль стен прямоугольника с внутренней стороны. Проходы должны остаться незакрашенными. Робот должен закрасить только клетки, удовлетворяющие данному условию. Например, для приведённого выше рисунка Робот должен закрасить следующие клетки (см. рисунок).

При исполнении алгоритма Робот не должен разрушиться, выполнение алгоритма должно завершиться. Конечное расположение Робота может быть произвольным. Алгоритм должен решать задачу для любого допустимого расположения стен и любого расположения и размера прохода внутри стены.
Алгоритм может быть выполнен в среде формального исполнителя или записан в текстовом редакторе.
Сохраните алгоритм в формате программы Кумир или в текстовом файле. Название файла и каталог для сохранения Вам сообщат организаторы экзамена.
Проверка решения с помощью ИИ доступна авторизованным пользователям
Решение.
Для решения задачи разделим движение Робота на этапы: вход внутрь прямоугольника, а затем последовательный обход всех четырёх стен изнутри с закрашиванием нужных клеток.
Шаг 1: Вход внутрь прямоугольника.
Робот находится снаружи у левой стены. Чтобы попасть внутрь, ему нужно найти проход в левой стене. Двигаемся вверх вдоль стены, пока слева стена (прохода нет):
нц пока не слева свободно
вверх
кц
Теперь Робот стоит напротив прохода. Заходим внутрь:
влево
Шаг 2: Закрашивание левой стены (изнутри).
Сначала закрасим нижнюю часть левой стены. Спускаемся вниз до угла, закрашивая клетки, пока слева стена:
нц пока не слева свободно
закрасить
вниз
кц
Теперь Робот в нижнем левом углу. Чтобы закрасить верхнюю часть левой стены, нужно сначала вернуться к проходу. Поднимаемся, пока слева свободно:
нц пока слева свободно
вверх
кц
Проходим мимо прохода (его красить не надо):
нц пока слева свободно
вверх
кц
Красим верхнюю часть левой стены до верхнего угла:
нц пока не слева свободно
закрасить
вверх
кц
Шаг 3: Закрашивание верхней стены.
Робот в верхнем левом углу. Красим вправо, пока сверху стена:
нц пока не сверху свободно
закрасить
вправо
кц
Шаг 4: Закрашивание правой стены.
Робот в верхнем правом углу. Красим вниз, пока справа стена:
нц пока не справа свободно
закрасить
вниз
кц
Шаг 5: Закрашивание нижней стены.
Робот в нижнем правом углу. Двигаемся влево, закрашивая клетки, пока снизу стена (до прохода):
нц пока не снизу свободно
закрасить
влево
кц
Пропускаем проход (не красим):
нц пока снизу свободно
влево
кц
Докрашиваем оставшуюся часть нижней стены до угла:
нц пока не снизу свободно
закрасить
влево
кц
Ответ:
использовать Робот
алг
нач
нц пока не слева свободно
вверх
кц
влево
нц пока не слева свободно
закрасить
вниз
кц
нц пока слева свободно
вверх
кц
нц пока слева свободно
вверх
кц
нц пока не слева свободно
закрасить
вверх
кц
нц пока не сверху свободно
закрасить
вправо
кц
нц пока не справа свободно
закрасить
вниз
кц
нц пока не снизу свободно
закрасить
влево
кц
нц пока снизу свободно
влево
кц
нц пока не снизу свободно
закрасить
влево
кц
кон
Источник: ФИПИ