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):
1

Объединение и пересечение

Объединение — вся область, занятая первой фигурой, второй фигурой и их общей частью. На схеме вся нужная область закрашена зелёным.

Пересечение — только общая часть двух фигур. Всё, что находится лишь в одной фигуре, в пересечение не входит.

Как быстро считать точки

Команда «Вперёд n» означает, что Черепаха проходит n единиц.

На горизонтальном или вертикальном отрезке длины n находится n + 1 целочисленных точек вместе с концами. Если концы считать не нужно, остаётся n - 1 точек.

1

Если получился большой прямоугольник со сторонами a и b, необязательно наносить каждую точку:

  • внутри вместе с границей: (a + 1) · (b + 1);
  • только внутри, без границы: (a - 1) · (b - 1).

Для пересечения прямоугольников берём размеры только общей части. Для объединения складываем количество точек двух фигур и один раз вычитаем точки их пересечения.

1

3. Решение на Python

Основной шаблон

Рисунок легко построить с помощью библиотеки turtle в Python. Покажем решение по шагам:

  1. Подключить библиотеку turtle.
  2. Отключить анимацию, задать масштаб k и направить Черепаху вверх.
  3. Перенести команды первого алгоритма в Python и построить первую фигуру.
  4. Поднять хвост, перейти к началу второй фигуры, опустить хвост и выполнить второй алгоритм.
  5. Снова поднять хвост, перебрать целочисленные координаты 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()

Разбор шаблона

  1. tracer(0) отключает пошаговую анимацию. Черепаха не показывает каждое отдельное движение, поэтому фигуры и точки строятся намного быстрее.

  2. left(90) нужна, чтобы выполнить условие «голова направлена вдоль положительного направления оси ординат». В Python Черепаха изначально смотрит вправо — вдоль положительного направления оси абсцисс.

  3. k = 20 — переменная масштаба. В командах forward и backward расстояние умножается на k, чтобы рисунок и расстояние между целочисленными точками были хорошо видны. На сам ответ масштаб не влияет. Углы в left и right на k не умножаются.

  4. forward(d) двигает Черепаху вперёд, backward(d) — назад. left(a) поворачивает налево, right(a) — направо. up() поднимает хвост, поэтому движение не рисует линию; down() опускает хвост и возвращает рисование.

  5. У команд есть короткие записи: fdforward, bkbackward, ltleft, rtright, puup, pddown. Например, fd(10 * k) и forward(10 * k) выполняют одно и то же действие.

  6. Два цикла в конце перебирают целые значения x и y. Команда goto(x * k, y * k) переносит Черепаху в очередную точку, а dot(3, 'red') ставит там красную точку диаметром 3 пикселя. Так на рисунке появляется сетка точек с целочисленными координатами.

  7. Границы 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]

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

Что считать

Построена одна замкнутая фигура. Нужно считать только точки строго внутри неё: точки на границе в ответ не входят.

1

Код по шаблону

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]

Определите периметр области пересечения фигур, ограниченных заданными алгоритмом линиями.

Что считать

Нужна общая часть двух прямоугольников — пересечение. В условии спрашивают периметр, поэтому целочисленные точки считать не нужно: по сетке определяем длину и ширину общей части.

1

Код по шаблону

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]

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

Что считать

Нужно объединение: все точки первой фигуры, все точки второй фигуры и точки их общей части.

Граница включается. Точки пересечения нельзя считать дважды.

1

Код по шаблону

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]

Определите периметр области пересечения фигур, ограниченных заданными алгоритмом линиями.

Что считать

Нужно пересечение, то есть внутренняя общая часть прямоугольников. Так как требуется периметр, считаем длины сторон этой общей части, а не количество точек сетки.

1

Код по шаблону

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