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

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

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