ЕГЭ, ОГЭ, программирование и робототехника в Калининграде

№ 6216. Авторская задача

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

У исполнителя существует 3 команды: Поднять перо, означающая переход к перемещению без рисования; Опустить перо, означающая переход в режим рисования; Сместиться x, y (где x, y — целые числа), вызывающая перемещение Чертёжника из текущего положения в точку с координатами x, y.

Чертёжнику был дан для исполнения следующий алгоритм:

Сместиться 77, 189
Опустить перо
Сместиться 288, 60
Сместиться 258, -130
Сместиться 0, -200
Сместиться -170, -78
Сместиться -118, 122
Сместиться 77, 189

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

import math as m
from turtle import *

tracer(0)  #

teleport(77, 189)

# --- if Python < 3.12 ---
# pu()
# goto(20,40)
# pd()
# --- end if ---

# Первая фигура
begin_poly()
goto(288, 60)
goto(258, -130)
goto(0, -200)
goto(-170, -78)
goto(-118, 122)
goto(77, 189)
end_poly()

coords = get_poly()
angles = []
count = 0

for coord in coords[1:]:
    angles.append(towards(*coord))
    goto(coord)

k_1 = m.tan(m.radians(angles[0]))
k_2 = m.tan(m.radians(angles[1]))
k_3 = m.tan(m.radians(angles[2]))
k_4 = m.tan(m.radians(angles[3]))
k_5 = m.tan(m.radians(angles[4]))
k_6 = m.tan(m.radians(angles[5]))

b_1 = coords[0][1] - k_1 * coords[0][0]
b_2 = coords[1][1] - k_2 * coords[1][0]
b_3 = coords[2][1] - k_3 * coords[2][0]
b_4 = coords[3][1] - k_4 * coords[3][0]
b_5 = coords[4][1] - k_5 * coords[4][0]
b_6 = coords[5][1] - k_6 * coords[5][0]


def get_min_max_coordinates(coordinates):
    min_x = m.floor(min(x for x, _ in coordinates))
    max_x = m.ceil(max(x for x, _ in coordinates))
    min_y = m.floor(min(y for _, y in coordinates))
    max_y = m.ceil(max(y for _, y in coordinates))
    return min_x, max_x, min_y, max_y


ranges = get_min_max_coordinates(coords)

for x in range(ranges[0], ranges[1]):
    for y in range(ranges[2], ranges[3]):
        if k_4 * x + b_4 < y < k_1 * x + b_1 and 
                k_5 * x + b_5 > y > k_2 * x + b_2 and 
                k_6 * x + b_6 > y > k_3 * x + b_3:
            count += 1

print(count)
Разберём это задание на бесплатном пробном занятии

Преподаватель покажет, как решать такие задачи, и подскажет, с чего начать подготовку. Группы до 8 человек, очно в Калининграде и онлайн.

Записаться на пробное занятие