Программирование робота - Обработка информации - ИНФОРМАЦИОННЫЕ ПРОЦЕССЫ

Информатика - Новый полный справочник для подготовки к ОГЭ

Программирование робота - Обработка информации - ИНФОРМАЦИОННЫЕ ПРОЦЕССЫ

В этом разделе рассмотрим задачу, где требуется написать программу для исполнителя Робот, который ездит по прямоугольному полю со стенками.

Разбор типовых задач

Исполнитель Робот умеет перемещаться по лабиринту, начерченному на плоскости, разбитой на клетки. Между соседними (по сторонам) клетками может стоять стена. Через неё Робот пройти не может.

У Робота есть девять команд. Четыре команды — это команды-приказы:

вверх вниз влево вправо

При выполнении любой из этих команд Робот перемещается на одну клетку соответственно: вверх ↑, вниз ↓, влево ← , вправо →. Если Робот получит команду передвижения сквозь стену, то он разрушится.

Также у Робота есть команда закрасить, при которой закрашивается клетка, где Робот находится в настоящий момент.

Ещё четыре команды — команды проверки условий. Эти команды проверяют, свободен ли путь для Робота в каждом из четырёх возможных направлений:

сверху свободно

снизу свободно

слева свободно

справа свободно

Данные команды можно использовать вместе с условием “если”, имеющим следующий вид:

если условие то

последовательность команд

все

Здесь условие — одна из команд проверки условия.

Последовательность команд — это одна или несколько любых команд-приказов.

Например, для передвижения на одну клетку вправо, если справа нет стенки, и закрашивания клетки можно использовать такой алгоритм:

если справа свободно то

вправо

закрасить

все

В одном условии можно использовать несколько команд проверки условий, применяя логические связки и, или, не, например:

если (справа свободно) и (не снизу свободно) то

вправо

все

Для повторения последовательности команд можно использовать цикл “пока”, имеющий следующий вид:

нц пока условие

последовательность команд

кц

Например, для движения вправо, пока это возможно, используется следующий алгоритм:

нц пока справа свободно

вправо

кц

Выполните задание.

На бесконечном поле есть горизонтальная и вертикальная стены. Левый конец горизонтальной стены соединён с верхним концом вертикальной стены. Длины стен неизвестны. В вертикальной стене есть ровно один проход, точное место прохода и его ширина неизвестны. Робот находится в клетке, расположенной непосредственно над горизонтальной стеной у её правого конца.

На рисунке указан один из возможных способов расположения стен и Робота (Робот обозначен буквой “Р”).

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

При исполнении алгоритма Робот не должен разрушиться, иначе выполнение алгоритма должно завершиться. Конечное расположение Робота может быть произвольным.

Алгоритм должен решать задачу для любого допустимого расположения стен.

Алгоритм может быть выполнен в среде формального исполнителя или записан в текстовом редакторе.

Сохраните алгоритм в текстовом файле.

В рассматриваемой задаче необходимо уметь писать программу на языке команд Робота, а также уметь пользоваться такими алгоритмическими конструкциями, как условие и цикл. И то и другое подробно разбирается в главах про Паскаль. Попробуйте применить навыки их использования и для этого исполнителя.

Для начала рассмотрим основные подзадачи, которые возникают при решении задач с Роботом.

Подзадача 1.

Робот находится на некотором (неизвестном) расстоянии до стены. Он должен доехать до стены. Требуемая позиция отмечена знаком “х”.

Пример:

Решение подзадачи 1

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

Данный русский текст возьмём за основу программы.

Требуется выполнять повторяющиеся действия (движение вправо), значит, будем использовать цикл.

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

Итак, нам ясно, что требуется использовать цикл пока, что в теле цикла нужно двигаться по одной клетке вправо. Остаётся только определить, какое условие следует написать после слова пока, а именно: какое условие должно выполняться, чтобы Робот мог сделать очередной шаг вправо. Очевидно, справа от Робота для этого должна быть свободная клетка. Если это не будет, а Робот сделает шаг вправо, то он врежется в стену и сломается.

Получаем такую идею:

нц пока справа свободно

вправо

кц

Посмотрим, верно ли она работает. Ведь мы не знаем, на каком расстоянии справа от Робота находится стена.

Проверим её для начала на приведённом примере.

Таблица к примеру

Положение Робота

Команда

Проверкаусловия

Пояснение



нц пока справа свободно

справа свободно? Да

Начинаем цикл пока. Сразу проверяем условие продолжения. Оно выполнилось, значит, выполняем тело цикла



вправо


В результате команды вправо Робот передвинулся на соседнюю клетку.

Тело цикла закончилось.




нц пока справа свободно

справа свободно? Да

Возвращаемся на строку проверки условия продолжения цикла. Оно снова выполнилось. Снова выполняем тело цикла.



вправо


Робот передвинулся ещё правее.



нц пока справа свободно

справа свободно? Да

Справа, по-прежнему, свободно. Можно выполнять цикл ещё раз.



вправо


Робот передвинулся ещё правее.



нц пока справа свободно

справа свободно? Да

Справа, по-прежнему, свободно. Можно выполнять цикл ещё раз.



вправо


Робот передвинулся ещё правее.



нц пока справа свободно

справа свободно? Нет

Справа от Робота не свободно (стена).

Цикл пока заканчивается.

Робот достиг цели.

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

Однако, есть одно начальное положение Робота, которое необходимо обязательно проверить, так как оно существенно отличается от остальных. В этом начальном положении Робот сразу стоит у стены:

По условию расстояние от Робота до стены неизвестно и может быть любым, например равным нулю. Этот случай надо обязательно проверить. Несмотря на то, что Робот уже находится в требуемой позиции, он всё равно должен будет выполнить ту программу, которую мы для него написали. Следовательно, нужно убедиться, что в результате её выполнения Робот не разрушится, программа завершится, и Робот после этого останется стоять в требуемой позиции.

Проверяем:

Положение Робота

Команда

Проверкаусловия

Пояснение



нц пока справа свободно

справа свободно? Нет

Справа от Робота не свободно (стена).

Цикл пока заканчивается.

Робот достиг цели.







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

Рассмотрим примеры неверного решения той же задачи:

Неверный пример 1 решения подзадачи 1

вправо

нц пока справа свободно

вправо

кц

На первый взгляд, это совершенно такое же решение. Единственное отличие — перед циклом Робот делает один шаг вправо. Ничего ведь страшного! (?) Роботу нужно сделать довольно-таки много шагов вправо, чтобы достичь стены.

Практически для всех случаев начального положения Робота это так и есть. Программа прекрасно работает. Однако, в одном случае это не так:

Положение Робота

Команда

Проверкаусловия

Пояснение



вправо


Робот сразу находится возле стены.

Первая же команда программы требует его передвинуться на одну клетку вправо.

А там — стена. Робот разрушается.







Неверный пример 2 решения подзадачи 1

нц пока справа свободно

вправо

кц

нц пока не справа свободно

влево

вправо

кц

Первая часть программы совпадает с правильным решением, рассмотренным нами выше.

В результате первого цикла Робот окажется возле стены в требуемой точке. Однако (из каких-то странных соображений) автор этой программы решил написать ещё один фрагмент.

К началу выполнения второго цикла Робот находится у стены. Поэтому второй цикл начинает выполняться. В нём Робот делает один шаг влево, после чего сразу делает один шаг вправо, возвращаясь в ту же клетку, где начался второй цикл. Снова проверяется условие второго цикла. Оно опять выполняется. Снова Робот делает шаги влево и вправо. И так бесконечно.

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

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

Программа считается верной только тогда, когда она успешно выполняется для любых начальных положений Робота. Если есть хотя бы одно положение, в котором это не так (Робот разрушается или программа не заканчивается из- за бесконечного цикла), вся программа считается целиком неверной.

Подзадача 2.

Робот находится возле стены. Длина стены неизвестна. Он должен доехать до края стены (в данном примере — до правого края). Требуемая позиция отмечена знаком “х”.

Пример

Решение подзадачи 2

В этот раз ничего не мешает Роботу двигаться вправо. Однако, движение необходимо будет прекратить, когда Робот доберётся до края стены.

Заметим, что написать программу, в которой Робот будет двигаться вдоль стены вправо и остановится ровно в клетке “х” — нельзя. Потому что с точки зрения условий, которые умеет проверять Робот, клетка “х” ничем не отличается от любой другой клетки возле стены (сверху от стены).

Действительно, для любой клетки над стеной проверка любого из трёх условий слева свободно, справа свободно, сверху свободно — ложь, а проверка условия снизу свободно — истина. Единственным отличием клетки “х” от остальных клеток над стеной является клетка, которая расположена справа от клетки “х”. Для неё условие снизу свободно — ложно.

То есть, чтобы отправить Робота к клетке “х”, нужно сделать так — двигать Робота вправо до тех пор, пока снизу от Робота есть стена. В результате Робот остановится в клетке, расположенной справа от клетки “х”. Остаётся только вернуть Робота на одну клетку назад, т. е. вправо.

Получаем программу решения этой подзадачи:

нц пока не снизу свободно

вправо

кц

влево

Проверьте сами, что эта программа верно работает и не ломается в обоих вариантах, для которых необходима проверка. То есть в приведённом варианте начального расположения Робота:

И в варианте, когда Робот уже находится в нужной клетке:

Заметим, что приведённая программа не будет правильно работать в ситуации, когда задача немного другая. Например:

Если попытаться запустить приведённую программу решения подзадачи 2 для данного поля со стенами, Робот разрушится при попытке пройти сквозь стену из клетки “х” вправо.

Однако, это не должно смущать, так как задача является не разновидностью подзадачи 2, а разновидностью подзадачи 1. Здесь вместо того, чтобы проверять наличие стены снизу, достаточно проверять отсутствие стены справа.

Подзадача 3.

Робот находится непосредственно возле края стены (в данном примере — возле правого края). Он должен оказаться по другую сторону от стены, возле того же края, но с другой стороны. Требуемая позиция отмечена знаком “х”.

Пример:

Решение подзадачи 3

В данной подзадаче Роботу не требуется двигаться в какую-либо сторону неизвестное количество действий. Ему достаточно обойти стену. Это делается за ограниченное количество действий-команд, не требующих повторяющихся действий. То есть, цикл здесь не требуется.

Решение задачи простое:

вправо

вниз

влево

Подзадача 4.

Робот находится непосредственно возле стены (в данном примере — возле левого края). Он должен закрасить все поля от своего текущего положения вплоть до края стены (в данном примере — вплоть до правого края стены).

Пример:

Исходное положение:

Требуется закрасить:

Решение подзадачи 4

С точки зрения движений, Робот должен сделать всё то же самое, что и при решении подзадачи 2 — двигаться вправо, пока снизу от него есть стена.

Возьмём за основу программу решения подзадачи 2:

нц пока не снизу свободно

вправо

кц

влево

Чтобы при этом клетки, через которые проходит Робот, оказались закрашенными, в программу следует добавить команду закрасить.

Так как закрасить нужно много клеток, команду закрасить будем выполнять много раз. Для этого лучше использовать цикл. Удобнее всего (если получится) совместить цикл закрашивания с циклом перемещения Робота до правого края стены.

Вот решение этой подзадачи:

нц пока не снизу свободно

закрасить

вправо

кц

Заметим, мы добавили команду закрасить в тело цикла, чтобы клетки, находящиеся над стеной, которые проезжает Робот, оказывались закрашенными.

Также мы убрали команду влево, стоявшую в решении подзадачи 2 после конца цикла, потому что в этой подзадаче неважно, в какой клетке окажется Робот.

В нашем случае Робот окажется в клетке, расположенной сразу справа от самой правой закрашенной клетки. Это хорошо понимать. Однако, по заданию нет необходимости возвращать Робота в какую-либо клетку.

Выполните самостоятельно трассировку этой программы для двух типовых случаев (стена длины 4 и стена длины 1) и убедитесь, что для них программа верно решает данную подзадачу.

Обратите внимание на то место программы, где располагается команда закрасить! Мы поставили её в цикл перед командой вправо. Хотя, на первый взгляд, нет никакого принципиального отличия от решения, когда команда закрасить стоит после команды вправо.

Рассмотрим это решение:

нц пока не снизу свободно

вправо

закрасить

кц

Попытаемся проверить его на таком простом примере.

Исходное положение:

Требуется закрасить:

Выполним эту программу по шагам.

Положение Робота

Команда

Проверка условия

Пояснение

нц пока не снизу свободно

не снизу свободно? Да

Начинаем цикл пока.

Сразу проверяем условие продолжения. Оно выполнилось, значит, выполняем тело цикла

вправо


Робот двигается на одну клетку вправо. Уже можно видеть, что клетка, в которой Робот находился изначально, осталась незакрашенной

закрасить


Закрашиваем клетку, где стоит Робот. Заканчивается тело цикла. Снова переходим к проверке условия продолжения цикла

нц пока не снизу свободно

не снизу свободно? Да

Проверяем условие продолжения. Оно выполнилось, значит, выполняем тело цикла

вправо


Робот двигается на одну клетку вправо

закрасить


Закрашиваем клетку, где стоит Робот. Видим, что Робот закрасил лишнюю клетку

Трассировка программы показала, что перестановка команд в теле цикла даёт сразу две ошибки — остаётся незакрашенной клетка, где Робот начинает движение, и закрашивается лишняя клетка, в которой Робот оказывается после цикла.

Предположим, мы заметили, что это решение оставляет незакрашенной начальную клетку.

Решаем исправить эту ошибку, добавив в программу “заплатку” — закрасив начальную клетку до начала цикла:

закрасить

нц пока не снизу свободно

вправо

закрасить

кц

Данная программа, к сожалению, также работает неправильно.

Выполним трассировку для простого примера со стеной длинной в две клетки.

Исходное положение:

Требуется закрасить:

Получим результат:

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

закрасить

нц пока не снизу свободно вправо

если не снизу свободно то

закрасить

все

кц

Данная программа решает подзадачу 4 правильно. Но, как видите, она существенно длиннее и сложнее для понимания.

Как же можно было в данном случае получить красивое решение, без заплаток, пытаясь исправить программу:

нц пока не снизу свободно

вправо

закрасить

кц

Выполнив программу на примере и обнаружив вот такой результат её работы:

хорошо заметить, что программа закрашивает правильное количество клеток, но совершает неверное действие в начале работы (оставляет незакрашенной начальную клетку) и в конце работы (закрашивает лишнюю (конечную) клетку). Это и есть верный признак того, что действия в цикле выполняются в неверном порядке и их нужно поменять местами, например, поставить последнюю команду тела цикла первой или, наоборот, первую команду тела цикла сделать последней. В случае, когда в теле цикла всего две команды, они просто меняются местами.

Как правило, после этого программа работает верно.

Один из способов сразу определить, какую команду следует поставить первой в теле цикла, выполнить действие с той клеткой, в которой Робот находится к моменту начала цикла. В данном случае Робот сразу был на клетке, которая должна оказаться закрашенной. Значит, первым действием тела цикла требуется красить текущую клетку!

Подзадача 5.

Робот находится непосредственно возле стены (в данном примере — возле левого края). Он должен закрасить все поля от своего текущего положения вплоть до края стены (в данном примере — вплоть до правого края стены).

Пример.

Исходное положение:

Требуется закрасить:

Решение подзадачи 5

Как и в случае с последним примером к решению подзадачи 2, неправильным решением будет совершать цикл, пока снизу от Робота есть стена, потому что в этом случае Робот разрушится при попытке на последнем шаге пройти сквозь стену командой вправо.

Условием для остановки Робота должна быть проверка того, что справа от Робота свободно.

Получаем, что за основу решения нужно взять программу из решения подзадачи 1 (двигаться вправо, пока справа свободно), но при этом добавить в неё закрашивание тех клеток, через которые проходит Робот.

Сделаем это:

нц пока справа свободно

закрасить

вправо

кц

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

Сделаем трассировку данной программы на простом примере.

Исходное положение:

Требуется закрасить:

Выполним программу по шагам:

Положение Робота

Команда

Проверка условия

Пояснение

нц пока справа свободно

справа свободно? Да

Начинаем цикл пока.

Сразу проверяем условие продолжения. Оно выполнилось, значит, выполняем тело цикла

закрасить


Закрасили начальную клетку

вправо


Передвинулись в соседнюю клетку. Тело цикла закончилось. Снова переходим к проверке условия продолжения цикла

нц пока справа свободно

справа свободно? Да

Проверяем условие продолжения. Оно выполнилось, значит, выполняем тело цикла

закрасить


Закрасили текущую клетку

вправо


Передвинулись в соседнюю клетку. Тело цикла закончилось. Снова переходим к проверке условия продолжения цикла

нц пока справа свободно

справа свободно? Нет

Проверяем условие продолжения. Оно не выполнилось. Заканчивается цикл и программа

Программа закончилась, но одна клетка, которую нужно было закрасить, осталась незакрашенной. Нужно ли переписывать программу или достаточно просто исправить одну ошибку, закрасив последнюю клетку? Сравним доводы в ту или иную сторону.

Клетка, которая осталась незакрашенной — это именно та клетка, где находится Робот после окончания работы программы. То есть, если в конец приведённой программы, после цикла, дописать команду закрасить, программа, возможно, станет работать верно.

Не нужно ли переписать программу, например, поменяв местами команды в теле цикла, как это было рассмотрено при обсуждении решения подзадачи 4? В данном случае, доводов в эту сторону нет, потому что количество клеток, которые оказались закрашенными в результате работы цикла, неверное. Не хватает закрасить ещё одну клетку. Значит, поменяв команды в теле цикла, закрасится столько же клеток, но останется незакрашенной начальная клетка. Так сделать тоже можно, но “заплатку” — закрашивание клетки вне цикла — всё равно придётся делать. Только в этом случае до цикла, а не после.

В итоге, правильное решение будет такое:

нц пока справа свободно

закрасить

вправо

кц

закрасить

Обязательно нужно проверить это решение для граничного случая, когда Робот уже стоит возле правой стены.

Исходное положение:

Требуется закрасить:

Выполним трассировку:

Положение Робота

Команда

Проверка условия

Пояснение


нц пока справа свободно

справа свободно? Нет

Начинаем цикл пока.

Сразу проверяем условие продолжения. Оно не выполнилось. Тело цикла не выполняется. Переходим к команде после цикла



закрасить


Закрашивается текущая клетка. Программа заканчивается



Программа чудесно справилась с поставленной задачей. Робот не разрушился. Программа закончилась. Все нужные клетки закрашены. Лишние — не закрашены. Успех!

Теперь рассмотрим неудачный пример решения этой подзадачи:

нц пока справа свободно

закрасить

вправо

закрасить

кц

Пример на первый взгляд работает.

Выполним трассировку на простом примере.

Исходное положение:

Требуется закрасить:

Положение Робота

Команда

Проверка условия

Пояснение

нц пока справа свободно

справа свободно? Да

Начинаем цикл пока.

Сразу проверяем условие продолжения. Оно выполнилось, значит, выполняем тело цикла

закрасить


Закрасили начальную клетку

вправо


Передвинулись в соседнюю клетку

закрасить


Закрасили текущую клетку. Тело цикло закончилось. Снова переходим к проверке условия продолжения цикла

нц пока справа свободно


Проверяем условие продолжения.

Оно выполнилось, значит, выполняем тело цикла

закрасить


Команда закрасить текущую клетку. Клетка уже закрашена. Однако по условию нет ограничений на количество способов красить клетку. Почему бы и нет!? Ничего плохого не произошло. Закрасили текущую клетку

вправо


Передвинулись в соседнюю клетку

закрасить


Закрасили текущую клетку. Тело цикла закончилось. Снова переходим к проверке условия продолжения цикла

нц пока справа свободно


Проверяем условие продолжения. Оно не выполнилось. Заканчивается цикл и программа

Все требуемые клетки закрашены. Вроде бы, всё чудесно.

Проверим, однако, работу этой программы на граничном примере — когда Робот сразу находится у правой стены.

Исходное положение:

Требуется закрасить:

Выполним трассировку:

Положение Робота

Команда

Проверка условия

Пояснение

нц пока справа свободно

справа свободно? Нет

Начинаем цикл пока. Сразу проверяем условие продолжения.

Оно не выполнилось. Тело цикла не выполняется. После цикла команд нет. Программа заканчивается

Неуспех! Единственная клетка, которую нужно было закрасить, осталась незакрашенной.

Это случилось оттого, что автор данной программы для исправления ошибки в одной клетке поставил команду-“заплатку” в цикл! Тем самым нарушил одну из рекомендаций по программированию циклов:

1. Повторяющиеся действия помещаем в цикл!

Это, кстати, все и так понимают. Если в цикл не поместить повторяющиеся действия, то эти действие выполнятся только один раз.

2. Действия, которые нужно выполнить только один раз, не нужно помещать в цикл!

А вот этим правилом часто пренебрегают, к сожалению, даже опытные программисты. Его невыполнение не всегда приводит к ошибкам программы, но почти всегда — к плохо понятному коду программы. Что, в свою очередь, затрудняет поиск ошибок.

Из подзадач, решение которых мы рассмотрели к настоящему моменту, можно сложить решение практически любой задачи Робота.

Рассмотрим решение задачи, приведённой в начале раздела: на бесконечном поле есть горизонтальная и вертикальная стены. Левый конец горизонтальной стены соединён с верхним концом вертикальной стены. Длины стен неизвестны. В вертикальной стене есть ровно один проход, точное место прохода и его ширина неизвестны. Робот находится в клетке, расположенной непосредственно над горизонтальной стеной у её правого конца.

На рисунке указан один из возможных способов расположения стен и Робота (Робот обозначен буквой “Р”).

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

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

Решение

Разобьём решение данной задачи на несколько подзадач:

1. Переместить Робота в угол, в ту клетку, у которой есть стена слева и снизу:

Как вы понимаете, это подзадача 1 — передвигать Робота, пока он не упрётся в стену.

2. Закрасить участок справа от нижней части вертикальной стены.

Из положения:

перейдём к положению:

Это подзадача 4 — закрасить клетки справа от стены.

3. Переведём Робота к следующему участку стены, чтобы справа от верхней части вертикальной стены повторить подзадачу 4.

Для этого нужно передвигать Робота на одну клетку вверх, пока слева от него свободно.

4. Закрасить участок справа от верхней части вертикальной стены.

Из положения:

перейдём к положению:

5. Передвинем Робота к следующему участку стены, чтобы слева от верхнего участка вертикальной стены повторить подзадачу 4.

Для этого достаточно передвинуть Робота влево и вниз.

6. Закрасить участок слева от верхней части вертикальной стены. Из положения:

перейдём к положению:

7. Переведём Робота к следующему участку стены, чтобы слева от нижней части вертикальной стены повторить подзадачу 4.

Для этого нужно передвигать Робота вниз, пока справа от него свободно.

8. Закрасить участок слева от нижней части вертикальной стены. Из положения:

перейдём к положению:

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

Получаем:

| 1. Переместить Робота в угол, в ту клетку, у которой есть стена слева и снизу:

нц пока слева свободно

влево

кц

| 2. Закрасить участок справа от нижней части вертикальной стены.

нц пока не слева свободно

закрасить

вверх

кц

| 3. Переведём Робота к следующему участку стены, чтобы справа от верхней части вертикальной стены повторить подзадачу 4.

| Будем передвигать Робота вверх, пока слева от него свободно

нц пока слева свободно

вверх

кц

| 4. Закрасить участок справа от верхней части вертикальной стены.

нц пока не слева свободно

закрасить

вверх

кц

| 5. Передвинем Робота к следующему участку стены, чтобы слева от верхнего участка вертикальной стены повторить подзадачу 4.

влево

вниз

| 6. Закрасить участок слева от верхней части вертикальной стены.

нц пока не справа свободно

закрасить

вниз

кц

| 7. Переведём Робота к следующему участку стены, чтобы слева от нижней части вертикальной стены повторить подзадачу 4.

| Будем передвигать Робота вниз, пока справа от негo свободно

нц пока справа свободно

вниз

кц

| 8. Закрасить участок слева от нижней части вертикальной стены.

нц пока не справа свободно

закрасить

вниз

кц






Для любых предложений по сайту: [email protected]