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

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

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