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

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

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