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


Робот умеет выполнять команды «вверх», «вниз», «влево», «вправо», «закрасить», проверки «сверху свободно», «снизу свободно», «слева свободно», «справа свободно», а также условные операторы и циклы «пока».
Решение по шагам
5 шаговДвигаемся влево до препятствия. Робот останавливается в клетке справа от его правой границы.
Поднимаемся вверх, пока слева находится стена препятствия. После этого Робот оказывается в клетке непосредственно над правым верхним углом препятствия.
Закрашиваем текущую клетку и последовательно перемещаемся влево, закрашивая все клетки над препятствием. Цикл заканчивается, когда слева появляется стена.
Один из корректных алгоритмов:
нц пока слева свободно
влево
кц
нц пока не слева свободно
вверх
кц
закрасить
нц пока слева свободно
влево
закрасить
кц
нц пока слева свободно; влево; кц; нц пока не слева свободно; вверх; кц; закрасить; нц пока слева свободно; влево; закрасить; кц
Этот ответ получен в разборе, но не сверен с официальным ключом из банка — проверьте выкладки, прежде чем заучивать результат.
Где здесь ошибаются
Закрашивание клеток самого препятствия вместо клеток над ним.
Отсутствие закрашивания первой клетки верхней строки.
Движение влево после достижения левой границы без проверки, из-за чего Робот может разрушиться.
Использование фиксированного числа шагов вместо циклов.