Задание №6 — Анализ алгоритмов для исполнителя
Исполнитель Цапля действует на плоскости с декартовой системой координат. В начальный момент Цапля находится в начале координат, её клюв направлен вдоль положительного направления оси ординат, клюв опущен. При опущенном клюве Цапля оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения. У исполнителя существует три команды: Вперёд n (где n — целое число), вызывающая передвижение Цапли на n единиц в том направлении, куда указывает её клюв; Направо m (где m — целое число), вызывающая изменение направления движения на m градусов по часовой стрелке; Дуга r, a, b (где r, a, b — целые числа), вызывающая передвижение Цапли из текущей точки с координатами (х, у) по дуге полуокружности с центром в точке с координатами (х + a, у + b) и радиусом r, движение по полуокружности идёт по часовой стрелке.
Запись Повтори k [Команда1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.
Цапле был дан для исполнения следующий алгоритм:
Направо 180 Вперёд 2 Направо 90 Вперёд 80 Направо 90 Вперёд 2 Повтори 8 [Дуга 5, 5, 0].
Определите, сколько точек с целочисленными координатами будут находиться внутри области, ограниченной линией, заданной данным алгоритмом. Точки на линии учитывать не следует.
Правильный ответ
391
Пояснение
Решение:
Направо 180 Вперёд 2 переводит Цаплю из в . Направо 90 направляет клюв вдоль отрицательного направления оси , Вперёд 80 даёт . Ещё одно Направо 90 — клюв вверх, Вперёд 2 даёт .
Команда Дуга 5, 5, 0 из точки описывает полуокружность радиуса 5 с центром по часовой стрелке: конечная точка — , а дуга выпирает вверх. Восемь таких дуг ведут из в и замыкают линию.
Итак, фигура — прямоугольник , на верхней стороне которого лежат восемь полукругов радиуса 5 с центрами , , , . Верхняя сторона прямоугольника проходит внутри фигуры, а точки стыка соседних дуг , , , лежат на границе и не считаются.
C = [-75, -65, -55, -45, -35, -25, -15, -5] # центры полуокружностей, r = 5
n = 0
for x in range(-86, 7):
for y in range(-3, 7):
pr = -80 <= x <= 0 and -2 <= y <= 0 # прямоугольник
pk = any(y >= 0 and (x - c) ** 2 + y * y <= 25 for c in C) # полукруги
gr = any(y >= 0 and (x - c) ** 2 + y * y == 25 for c in C) \
or (pr and (x == -80 or x == 0 or y == -2)) # точки на линии
if (pr or pk) and not gr:
n += 1
print(n)
Программа печатает 391. Для контроля: площадь равна .
Ответ: 391