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