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

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

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