Задание №6. Черепаха рисует, а мы считаем точки
Что от тебя хотят
Черепаха стоит в начале координат, голова смотрит вверх (вдоль оси Y). Ей дают программу: Вперёд 10, Направо 90, Повтори, а иногда Поднять хвост, чтобы переместиться без следа. В итоге на плоскости остаётся контур. Вопрос: сколько точек с целыми координатами находится внутри фигуры (или внутри и на границе).
Идея в три шага
- Нарисовать. Запусти программу в модуле
turtleи убедись, что фигура такая, как ты себе представлял. - Выписать вершины. Для прямоугольника достаточно двух противоположных углов.
- Посчитать. Двойным циклом пройди по всем целым точкам и проверь неравенства.
left(90).
Разбор на живом примере
Черепаха выполняет: Повтори 2 [Вперёд 10 Направо 90 Вперёд 18 Направо 90]. Поднять хвост. Вперёд 5 Направо 90 Вперёд 7 Налево 90. Опустить хвост. Повтори 2 [Вперёд 10 Направо 90 Вперёд 7 Направо 90]. Сколько точек с целыми координатами находится внутри объединения двух фигур, включая точки на линиях?
- Первый цикл рисует прямоугольник с углами (0, 0) и (18, 10): вверх на 10, вправо на 18, вниз на 10, влево на 18.
- Потом хвост поднят: вверх на 5, вправо на 7. Черепаха оказывается в (7, 5) и смотрит вверх.
- Второй цикл рисует прямоугольник с углами (7, 5) и (14, 15).
- В первом вместе с границей: x от 0 до 18 и y от 0 до 10, это 19 · 11 = 209 точек. Во втором: x от 7 до 14 и y от 5 до 15, это 8 · 11 = 88 точек.
- Пересечение: x от 7 до 14 и y от 5 до 10, то есть 8 · 6 = 48. Эти точки посчитаны дважды: 209 + 88 − 48 = 249.
Ответ: 249. Это задача с ЕГЭ-2023, двойной цикл из второго окна даёт то же число.
<= на строгие <. Остальное не меняется.
Если фигура не прямоугольник
Для любого многоугольника с вершинами в целых точках работает формула Пика: площадь равна числу внутренних точек плюс половина числа граничных, минус единица. Отсюда внутренних точек: площадь минус половина граничных плюс один.
Разновидности и прототипы задания на экзамене
Код решения на Python
Запустить код в онлайн-песочницеfrom turtle import *
tracer(0)
k = 20
left(90)
for i in range(2):
forward(10 * k)
right(90)
forward(18 * k)
right(90)
penup()
forward(5 * k)
right(90)
forward(7 * k)
left(90)
pendown()
for i in range(2):
forward(10 * k)
right(90)
forward(7 * k)
right(90)
penup()
for x in range(-1, 20):
for y in range(-1, 17):
goto(x * k, y * k)
dot(3, "red")
update()
done()
count = 0
for x in range(-5, 30):
for y in range(-5, 30):
if (0 <= x <= 18 and 0 <= y <= 10) or (7 <= x <= 14 and 5 <= y <= 15):
count += 1
print(count)
Типичные ошибки
left(90) в началеleft(90).or).<, «включая» это <=.ГРОБ №6: Огромные числа
Команды вроде «Вперёд 500» дают фигуру, которую не нарисуешь и которую бессмысленно считать глазами.
Лайфхаки на экзамене
- Рисуй с множителем
k = 30: единица в задаче станет 30 пикселями, и фигура поместится на экране. - Диапазон двойного цикла бери с запасом в несколько единиц за вершинами, чтобы не потерять крайние точки.
- Хвост поднят:
penup(), опущен:pendown(). Это в точности «Поднять хвост» и «Опустить хвост».