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

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

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