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

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

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