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

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

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