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

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

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