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

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

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