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

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

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