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

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

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