1. Введение
В задании №6 исполнитель Черепаха перемещается по координатной плоскости и рисует одну или несколько фигур. Нужно посчитать точки с целочисленными координатами, которые находятся внутри нужной области. В условии отдельно указывается, включать ли точки на границе.
Встречаются три основных типа задания:
- Черепаха строит одну фигуру — считаем точки внутри неё;
- Черепаха строит две фигуры — считаем точки в их пересечении;
- Черепаха строит две фигуры — считаем точки в их объединении.
Основной способ решения: перенести алгоритм в Python, построить фигуры в увеличенном масштабе и отметить целочисленные точки.
2. Теория
Как работает Черепаха
Черепаха движется по координатной плоскости. Когда хвост опущен, она оставляет линию. Когда хвост поднят, она просто переходит в другую точку. Команда «Повтори k [...]» означает, что все команды в скобках выполняются k раз.
В задачах ЕГЭ Черепаха обычно начинает в точке (0, 0) и смотрит вверх. Python-черепаха сначала смотрит вправо, поэтому перед выполнением алгоритма пишем left(90).
Масштаб k нужен только для удобного рисунка. Например, forward(12 * k) изображает команду «Вперёд 12». Число k при подсчёте точек не учитывается.
| Команда | Что делает Черепаха | Запись на Python |
|---|---|---|
Вперёд d | Проходит d единиц вперёд | forward(d * k) или fd(d * k) |
Назад d | Проходит d единиц назад | backward(d * k) или bk(d * k) |
Направо a | Поворачивается направо на a градусов | right(a) или rt(a) |
Налево a | Поворачивается налево на a градусов | left(a) или lt(a) |
| Поднять хвост | Перестаёт рисовать линию | up() или pu() |
| Опустить хвост | Снова начинает рисовать линию | down() или pd() |
Повтори m [...] | Повторяет команды в скобках m раз | for _ in range(m): |
Объединение и пересечение
Объединение — вся область, занятая первой фигурой, второй фигурой и их общей частью. На схеме вся нужная область закрашена зелёным.
Пересечение — только общая часть двух фигур. Всё, что находится лишь в одной фигуре, в пересечение не входит.
Как быстро считать точки
Команда «Вперёд n» означает, что Черепаха проходит n единиц.
На горизонтальном или вертикальном отрезке длины n находится n + 1 целочисленных точек вместе с концами. Если концы считать не нужно, остаётся n - 1 точек.
Если получился большой прямоугольник со сторонами a и b, необязательно наносить каждую точку:
- внутри вместе с границей:
(a + 1) · (b + 1); - только внутри, без границы:
(a - 1) · (b - 1).
Для пересечения прямоугольников берём размеры только общей части. Для объединения складываем количество точек двух фигур и один раз вычитаем точки их пересечения.
3. Решение на Python
Основной шаблон
Рисунок легко построить с помощью библиотеки turtle в Python. Покажем решение по шагам:
- Подключить библиотеку
turtle. - Отключить анимацию, задать масштаб
kи направить Черепаху вверх. - Перенести команды первого алгоритма в Python и построить первую фигуру.
- Поднять хвост, перейти к началу второй фигуры, опустить хвост и выполнить второй алгоритм.
- Снова поднять хвост, перебрать целочисленные координаты
xиyи поставить в каждой точке отметку командойdot(3, 'red').
from turtle import *
tracer(0)
k = 20
left(90)
for i in range(3):
forward(27 * k)
right(90)
forward(12 * k)
right(90)
up()
forward(6 * k)
left(90)
down()
for i in range(4):
forward(83 * k)
right(90)
forward(77 * k)
right(90)
up()
for x in range(-50, 50):
for y in range(-50, 50):
goto(x * k, y * k)
dot(3, 'red')
exitonclick()
Разбор шаблона
-
tracer(0)отключает пошаговую анимацию. Черепаха не показывает каждое отдельное движение, поэтому фигуры и точки строятся намного быстрее. -
left(90)нужна, чтобы выполнить условие «голова направлена вдоль положительного направления оси ординат». В Python Черепаха изначально смотрит вправо — вдоль положительного направления оси абсцисс. -
k = 20— переменная масштаба. В командахforwardиbackwardрасстояние умножается наk, чтобы рисунок и расстояние между целочисленными точками были хорошо видны. На сам ответ масштаб не влияет. Углы вleftиrightнаkне умножаются. -
forward(d)двигает Черепаху вперёд,backward(d)— назад.left(a)поворачивает налево,right(a)— направо.up()поднимает хвост, поэтому движение не рисует линию;down()опускает хвост и возвращает рисование. -
У команд есть короткие записи:
fd—forward,bk—backward,lt—left,rt—right,pu—up,pd—down. Например,fd(10 * k)иforward(10 * k)выполняют одно и то же действие. -
Два цикла в конце перебирают целые значения
xиy. Командаgoto(x * k, y * k)переносит Черепаху в очередную точку, аdot(3, 'red')ставит там красную точку диаметром 3 пикселя. Так на рисунке появляется сетка точек с целочисленными координатами. -
Границы
rangeподбирают под размер фигуры. Например,range(-50, 50)перебирает координаты от-50до49: правое число50в диапазон не входит.
4. Практика
Задача 1. Точки внутри одной фигуры
Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен.
При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения.
У исполнителя существует 6 команд:
- Поднять хвост — переход к перемещению без рисования;
- Опустить хвост — переход в режим рисования;
- Вперёд
n— передвижение Черепахи наnединиц в направлении её головы; - Назад
n— передвижение в противоположном направлении; - Направо
m— поворот наmградусов по часовой стрелке; - Налево
m— поворот наmградусов против часовой стрелки.
Запись Повтори k [Команда1 Команда2 ... КомандаS] означает, что последовательность из S команд повторится k раз.
Черепахе был дан для исполнения следующий алгоритм:
Направо 90
Повтори 3 [Направо 45 Вперёд 10 Направо 45]
Направо 315 Вперёд 10
Повтори 2 [Направо 90 Вперёд 10]
Определите, сколько точек с целочисленными координатами будут находиться внутри области, которая ограничена линией, заданной алгоритмом. Точки на линии учитывать не следует.
Что считать
Построена одна замкнутая фигура. Нужно считать только точки строго внутри неё: точки на границе в ответ не входят.
Код по шаблону
from turtle import *
k = 15
tracer(0)
left(90)
right(90)
for i in range(3):
right(45)
forward(10 * k)
right(45)
right(315)
forward(10 * k)
for i in range(2):
right(90)
forward(10 * k)
up()
for x in range(-50, 50):
for y in range(-50, 50):
goto(x * k, y * k)
dot(3, 'red')
exitonclick()
Быстрый подсчёт
Если посмотреть на фигуру под углом, точки удобно считать по наклонным прямым. На одной такой прямой находится 7 внутренних точек. Всего таких прямых 29.
7 · 29 = 203
Ответ: 203
Задача 2. Периметр пересечения
Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен.
Черепахе был дан для исполнения следующий алгоритм:
Повтори 9 [Вперёд 22 Направо 90 Вперёд 6 Направо 90]
Поднять хвост
Вперёд 1 Направо 90 Вперёд 5 Налево 90
Опустить хвост
Повтори 9 [Вперёд 53 Направо 90 Вперёд 75 Направо 90]
Определите периметр области пересечения фигур, ограниченных заданными алгоритмом линиями.
Что считать
Нужна общая часть двух прямоугольников — пересечение. В условии спрашивают периметр, поэтому целочисленные точки считать не нужно: по сетке определяем длину и ширину общей части.
Код по шаблону
from turtle import *
k = 15
tracer(0)
left(90)
for i in range(9):
forward(22 * k)
right(90)
forward(6 * k)
right(90)
up()
forward(1 * k)
right(90)
forward(5 * k)
left(90)
down()
for i in range(9):
forward(53 * k)
right(90)
forward(75 * k)
right(90)
up()
for x in range(-80, 20):
for y in range(-40, 30):
goto(x * k, y * k)
dot(3, 'red')
exitonclick()
Быстрый подсчёт
Первая фигура — прямоугольник 6 × 22.
Второй прямоугольник перекрывает его по ширине от x = 0 до x = 1, то есть на 1 единицу, и по высоте от y = 0 до y = 21, то есть на 21 единицу.
Пересечение имеет размеры 1 × 21.
2 · (1 + 21) = 44
Ответ: 44
Задача 3. Точки в объединении
Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен.
Черепахе был дан для исполнения следующий алгоритм:
Повтори 2 [Вперёд 3 Направо 90 Вперёд 20 Направо 90]
Поднять хвост
Назад 8 Направо 90 Вперёд 9 Налево 90
Опустить хвост
Повтори 2 [Вперёд 16 Направо 90 Вперёд 8 Направо 90]
Определите, сколько точек с целочисленными координатами находятся внутри объединения фигур, ограниченного заданными алгоритмом линиями, включая точки на линиях.
Что считать
Нужно объединение: все точки первой фигуры, все точки второй фигуры и точки их общей части.
Граница включается. Точки пересечения нельзя считать дважды.
Код по шаблону
from turtle import *
k = 15
tracer(0)
left(90)
for i in range(2):
forward(3 * k)
right(90)
forward(20 * k)
right(90)
up()
backward(8 * k)
right(90)
forward(9 * k)
left(90)
down()
for i in range(2):
forward(16 * k)
right(90)
forward(8 * k)
right(90)
up()
for x in range(-20, 30):
for y in range(-20, 20):
goto(x * k, y * k)
dot(3, 'red')
exitonclick()
Быстрый подсчёт
Первая фигура — прямоугольник 20 × 3, в нём:
(20 + 1) · (3 + 1) = 84 точки.
Вторая фигура — прямоугольник 8 × 16, в нём:
(8 + 1) · (16 + 1) = 153 точки.
Пересечение имеет размеры 8 × 3, поэтому содержит:
(8 + 1) · (3 + 1) = 36 точек.
Вычитаем общие точки один раз:
(20 + 1) · (3 + 1) + (8 + 1) · (16 + 1) - (8 + 1) · (3 + 1) = 201
Ответ: 201
Задача 4. Периметр пересечения больших прямоугольников
Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен.
Черепахе был дан для исполнения следующий алгоритм:
Повтори 10 [Вперёд 22 Направо 90 Вперёд 16 Направо 90]
Поднять хвост
Вперёд 1 Направо 90 Вперёд 1 Налево 90
Опустить хвост
Повтори 10 [Вперёд 72 Направо 90 Вперёд 79 Направо 90]
Определите периметр области пересечения фигур, ограниченных заданными алгоритмом линиями.
Что считать
Нужно пересечение, то есть внутренняя общая часть прямоугольников. Так как требуется периметр, считаем длины сторон этой общей части, а не количество точек сетки.
Код по шаблону
from turtle import *
k = 15
tracer(0)
left(90)
for i in range(10):
forward(22 * k)
right(90)
forward(16 * k)
right(90)
up()
forward(1 * k)
right(90)
forward(1 * k)
left(90)
down()
for i in range(10):
forward(72 * k)
right(90)
forward(79 * k)
right(90)
up()
for x in range(-10, 90):
for y in range(-10, 80):
goto(x * k, y * k)
dot(3, 'red')
exitonclick()
Быстрый подсчёт
Первый прямоугольник занимает x от 0 до 16 и y от 0 до 22.
Второй — x от 1 до 80 и y от 1 до 73.
Общая часть занимает x от 1 до 16 и y от 1 до 22: её размеры 15 × 21.
2 · (15 + 21) = 72
Ответ: 72