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

Алгоритм решения задания 6. Часть 2

В прошлой статье мы научились работать с функциями Черепахи из модуля turtle, разобрались с пересечением и объединением фигур и опробовали алгоритм решения задания 6 первого типа.

В этой статье продолжим работу с заданием, но уделим внимание второму типу: будем находить площадь и периметр областей пересечения и объединения.

Не будем затягивать и сразу приступим к практике!

Алгоритм решения

Изменения в коде будут минимальными. Главное – задать точкам цвет, обычно белый, и увеличить их размер. Первый блок решения может выглядеть так:

from turtle import *

tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12

lt(90) # Не обязательно

По сравнению с кодом из прошлой статьи здесь изменены значения только двух переменных: dot_color и dot_size.

Для расстановки точек необязательно точно подбирать диапазоны. Можно взять область с запасом, например от −50 до 50. Но чем меньше лишних координат перебирает программа, тем быстрее строится рисунок.

В остальном же код остаётся прежним. Давайте опробуем его на задании с такой формулировкой (как и в прошлый раз, ограничимся лишь алгоритмом черепахи и условием):

Исполнитель Черепаха действует на плоскости с декартовой системой координат.

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

У исполнителя существует 6 команд: Поднять хвост, означающая переход к перемещению без рисования; Опустить хвост, означающая переход в режим рисования; Вперёд n (где n — целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Назад n (где n — целое число), вызывающая перемещение в противоположном голове направлении; Направо m (где m — целое число), вызывающая изменение направления движения на m градусов по часовой стрелке; Налево m (где m — целое число), вызывающая изменение направления движения на m градусов против часовой стрелки.

Запись Повтори k [Команда 1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.

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

Повтори 9 [Вперёд 17 Налево 90 Вперед 8 Налево 90 Вперёд 17]
Поднять хвост
Налево 90 Вперед 3 Направо 90 Вперёд 5 Налево 90
Опустить хвост
Повтори 4 [Вперёд 97 Направо 90 Вперёд 132 Направо 90]

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

Открыть задание

Первая фигура чертится по алгоритму: Повтори 9 [Вперёд 17 Налево 90 Вперёд 8 Налево 90 Вперёд 17]. Переведём его на язык Python:

for _ in range(9):
    fd(17 * scale) # Вперёд 17
    lt(90) # Налево 90
    fd(8 * scale) # Вперёд 8
    lt(90) # Налево 90
    fd(17 * scale)  # Вперёд 17

Далее Черепаха перемещается с поднятым хвостом к началу второй фигуры: Налево 90 Вперёд 3 Направо 90 Вперёд 5 Налево 90.

В Python это выглядит так:

pu() # Поднять хвост
lt(90) # Налево 90
fd(3 * scale)  # Вперёд 3
rt(90) # Направо 90
fd(5 * scale)  # Вперёд 5
lt(90) # Налево 90
pd() # Опустить хвост

Вторая фигура задана алгоритмом: Повтори 4 [Вперёд 97 Направо 90 Вперёд 132 Направо 90]. Перепишем его на Python:

for _ in range(4):
    fd(97 * scale) # Вперёд 97
    rt(90) # Направо 90
    fd(132 * scale) # Вперёд 132
    rt(90) # Направо 90

К этим трём блокам кода добавляем блоки с базовой настройкой и размещением точек. В итоге наша программа приобретает такой вид:

from turtle import *

tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12

lt(90) # Не обязательно

color("#A7D380")
# Повтори 9
for _ in range(9):
    fd(17 * scale) # Вперёд 17
    lt(90) # Налево 90
    fd(8 * scale) # Вперёд 8
    lt(90) # Налево 90
    fd(17 * scale) # Вперёд 17

pu() # Поднять хвост
lt(90) # Налево 90
fd(3 * scale) # Вперёд 3
rt(90) # Направо 90
fd(5 * scale) # Вперёд 5
lt(90) # Налево 90
pd() # Опустить хвост

color("#F76D47")
# Повтори 4
for _ in range(4):
    fd(97 * scale) # Вперёд 97
    rt(90) # Направо 90
    fd(132 * scale) # Вперёд 132
    rt(90) # Направо 90

pu() # Поднять хвост
for x in range(-5, 1):
    for y in range(-17, -4):
        goto(x * scale, y * scale) # Переместиться к x, y
        dot(dot_size, dot_color) # Поставить точку

done()

Запустим её и увидим такое изображение на экране.

Прямоугольник с двумя пунктирными зелёными и оранжевыми сторонами – как раз та область, периметр которой нужно вычислить. Отрезков немного, поэтому посчитаем вручную.

Ширина этого прямоугольника равна 5 единичным отрезкам, а длина – 12. Складываем все стороны: 5 + 5 + 12 + 12. И получаем ответ на это задание: 34.

Пример 1

Только что мы работали с периметром пересечения. Но порой требуется найти и периметр объединения нескольких фигур. Правда, в таких случаях формулировка звучит несколько иначе:

Исполнитель Черепаха действует на плоскости с декартовой системой координат.

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

У исполнителя существует 6 команд: Поднять хвост, означающая переход к перемещению без рисования; Опустить хвост, означающая переход в режим рисования; Вперёд n (где n — целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Назад n (где n — целое число), вызывающая перемещение в противоположном голове направлении; Направо m (где m — целое число), вызывающая изменение направления движения на m градусов по часовой стрелке; Налево m (где m — целое число), вызывающая изменение направления движения на m градусов против часовой стрелки.

Запись Повтори k [Команда 1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.

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

Повтори 3 [Опустить хвост
Повтори 2 [Вперёд 10 Направо 90 Вперёд 10 Направо 90]
Поднять хвост
Вперёд 5 Направо 90 Вперёд 5 Налево 90]

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

Открыть задание

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

Давайте построчно перепишем алгоритм. Фраза «Повтори 3» на Python переводится как for _ in range(3):. Затем следует команда «Опустить хвост», то есть pd().

Ну а второй цикл уже привычный: Повтори 2 [Вперёд 10 Направо 90 Вперёд 10 Направо 90]. Запишем его так:

for _ in range(2):
    fd(10 * scale) # Вперёд 10
    rt(90) # Направо 90
    fd(10 * scale) # Вперёд 10
    rt(90) # Направо 90

Далее идёт оставшаяся часть алгоритма внутри первого цикла for:

pu() # Поднять хвост
fd(5 * scale) # Вперёд 5
rt(90) # Направо 90
fd(5 * scale) # Вперёд 5
lt(90) # Налево 90

Допишем в начало код базовой настройки, а в конец блок кода с расстановкой точек и получим такую программу:

from turtle import *

tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12

lt(90) # Не обязательно

color("#A7D380") # Цвет границ

# Повтори 3
for _ in range(3):
    pd() # Опустить хвост

    # Повтори 2
    for _ in range(2):
        fd(10 * scale) # Вперёд 10
        rt(90) # Направо 90
        fd(10 * scale) # Вперёд 10
        rt(90) # Направо 90

    pu() # Поднять хвост
    fd(5 * scale) # Вперёд 5
    rt(90) # Направо 90
    fd(5 * scale) # Вперёд 5
    lt(90) # Налево 90

pu() # Поднять хвост
for x in range(0, 21):
    for y in range(0, 21):
        goto(x * scale, y * scale) # Переместиться к x, y
        dot(dot_size, dot_color) # Поставить точку

done()

Прежде чем запускать программу, подумаем, что увидим на экране. Внешний цикл повторяется три раза, поэтому Черепаха построит три квадрата и объединит их в одну сложную фигуру.

Во вложенном цикле Черепаха проходит две соседние стороны квадрата по 10 единиц. Цикл повторяется дважды, поэтому в итоге получается целый квадрат со стороной 10.

Затем Черепаха поднимает хвост и смещается на 5 единиц вверх и на 5 вправо – точно в центр только что начерченного квадрата.

И далее снова повторяется отрисовка квадрата и переход к его центру. Значит, на экране у нас будет три квадрата, каждый из которых начинается из центра предыдущего.

Запустим код и убедимся в этом.

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

Сторона каждого квадрата равна 10. Новый квадрат начинается в центре предыдущего, поэтому восемь коротких участков внешней границы имеют длину 5 – половину стороны квадрата.

Отметим все числа на рисунке (длины маленьких сторон на углах отметим по одному разу).

Остаётся сложить длины всех участков по часовой стрелке: 10 + 5 + 5 + 5 + 5 + 10 + 10 + 5 + 5 + 5 + 5 + 10 = 80. Это число и запишем в ответ.

Пример 2

Теперь поработаем с площадью фигур. Начнём с такой формулировки:

Исполнитель Черепаха действует на плоскости с декартовой системой координат.

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

У исполнителя существует 6 команд: Поднять хвост, означающая переход к перемещению без рисования; Опустить хвост, означающая переход в режим рисования; Вперёд n (где n — целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Назад n (где n — целое число), вызывающая перемещение в противоположном голове направлении; Направо m (где m — целое число), вызывающая изменение направления движения на m градусов по часовой стрелке; Налево m (где m — целое число), вызывающая изменение направления движения на m градусов против часовой стрелки.

Запись Повтори k [Команда 1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.

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

Повтори 4 [Вперёд 19 Направо 90 Вперёд 30 Направо 90]
Поднять хвост
Вперёд 2 Направо 90 Вперёд 8 Налево 90
Опустить хвост
Повтори 4 [Вперёд 93 Направо 90 Вперёд 97 Направо 90]

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

Открыть задание

Алгоритм здесь классический, ничего необычного в нём нет. Просто переписываем его на языке Python. Выглядеть он будет так:

# Повтори 4
for _ in range(4):
    fd(19 * scale) # Вперёд 19
    rt(90) # Направо 90
    fd(30 * scale) # Вперёд 30
    rt(90) # Направо 90

# Перемещение
pu()
fd(2 * scale) # Вперёд 2
rt(90) # Направо 90
fd(8 * scale) # Вперёд 8
lt(90)  # Налево 90
pd()

# Повтори 4
for _ in range(4):
    fd(93 * scale) # Вперёд 93
    rt(90) # Направо 90
    fd(97 * scale) # Вперёд 97
    rt(90) # Направо 90

Имея опыт решения задания 6, можем сразу сказать, что будут построены два прямоугольника. Второй, более крупный, смещён относительно первого на 2 и 8 единиц.

Давайте допишем программу полностью и запустим её.

from turtle import *

tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12

lt(90) # Не обязательно

color("#A7D380")

# Повтори 4
for _ in range(4):
    fd(19 * scale) # Вперёд 19
    rt(90) # Направо 90
    fd(30 * scale) # Вперёд 30
    rt(90) # Направо 90

# Перемещение
pu()
fd(2 * scale) # Вперёд 2
rt(90) # Направо 90
fd(8 * scale) # Вперёд 8
lt(90) # Налево 90
pd()

color("#F76D47")

# Повтори 4
for _ in range(4):
    fd(93 * scale) # Вперёд 93
    rt(90) # Направо 90
    fd(97 * scale) # Вперёд 97
    rt(90) # Направо 90

pu() # Поднять хвост
for x in range(0, 31):
    for y in range(0, 20):
        goto(x * scale, y * scale) # Переместиться к x, y
        dot(dot_size, dot_color) # Поставить точку

done()

В итоге имеем такое пересечение двух прямоугольников.

Отметим жёлтым цветом интересующую нас область.

Нужно вычислить длину и ширину этой области. Исходим из размеров первой, зелёной, фигуры. Она задаётся командами Вперёд 19 и Вперёд 30, поэтому её стороны равны 19 и 30.

Теперь определим смещение второй фигуры по движению Черепахи с поднятым хвостом: Вперёд 2 Направо 90 Вперёд 8 Налево 90. Получаем смещения на 2 и 8 единиц. Отметим их на рисунке.

Теперь будет несложно подсчитать размеры сторон пересечения: от 30 отнимаем 8 и от 19 отнимаем 2. Получается, что длина пересечения равна 22, а ширина – 17.

Для вычисления площади осталось перемножить эти числа: 22 × 17 = 374. Это и есть ответ.

Пример 3

В заключение решим задание на площадь объединения фигур:

Исполнитель Черепаха действует на плоскости с декартовой системой координат.

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

У исполнителя существует 6 команд: Поднять хвост, означающая переход к перемещению без рисования; Опустить хвост, означающая переход в режим рисования; Вперёд n (где n — целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Назад n (где n — целое число), вызывающая перемещение в противоположном голове направлении; Направо m (где m — целое число), вызывающая изменение направления движения на m градусов по часовой стрелке; Налево m (где m — целое число), вызывающая изменение направления движения на m градусов против часовой стрелки.

Запись Повтори k [Команда 1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.

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

Повтори 3 [Вперёд 39 Направо 90 Вперёд 48 Направо 90]
Поднять хвост
Вперёд 27 Направо 90 Вперёд 24 Налево 90
Опустить хвост
Повтори 3 [Вперёд 29 Направо 90 Назад 18 Направо 90]

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

Открыть задание

Подробно останавливаться на коде уже не будем. Алгоритм всех передвижений черепахи запишем так:

# Повтори 3
for _ in range(3):
    fd(39 * scale) # Вперёд 39
    rt(90) # Направо 90
    fd(48 * scale) # Вперёд 48
    rt(90) # Направо 90

# Перемещение
pu()
fd(27 * scale) # Вперёд 27
rt(90) # Направо 90
fd(24 * scale) # Вперёд 24
lt(90)  # Налево 90
pd()

# Повтори 3
for _ in range(3):
    fd(29 * scale) # Вперёд 29
    rt(90) # Направо 90
    bk(18 * scale) # Назад 18
    rt(90) # Направо 90

Дополним программу базовой настройкой, цветом каждой фигуры и расстановкой точек:

from turtle import *

tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12

lt(90) # Не обязательно

color("#A7D380")

# Повтори 3
for _ in range(3):
    fd(39 * scale) # Вперёд 39
    rt(90) # Направо 90
    fd(48 * scale) # Вперёд 48
    rt(90) # Направо 90

# Перемещение
pu()
fd(27 * scale) # Вперёд 27
rt(90) # Направо 90
fd(24 * scale) # Вперёд 24
lt(90) # Налево 90
pd()

color("#F76D47")

# Повтори 3
for _ in range(3):
    fd(29 * scale) # Вперёд 29
    rt(90) # Направо 90
    bk(18 * scale) # Назад 18
    rt(90) # Направо 90

pu() # Поднять хвост
for x in range(0, 50):
    for y in range(-20, 50):
        goto(x * scale, y * scale) # Переместиться к x, y
        dot(dot_size, dot_color) # Поставить точку

done()

Проверим результат работы программы.

Здесь расположение фигур сложнее, поэтому разберём движение Черепахи по этапам.

Изначально она находилась в точке с координатами (0, 0), а её голова была направлена «вверх». Первым делом выполняются команды: Вперёд 39 Направо 90 Вперёд 48 Направо 90. То есть черепаха рисует две стороны прямоугольника с длинами 39 и 48 единиц.

Далее снова выполняются всё те же команды и прямоугольник дорисовывается полностью.

А на третьей итерации цикла for черепаха перемещается в правый верхний угол фигуры и поворачивается головой «вниз».

Далее идёт перемещение с поднятым хвостом вперёд на 27 единиц.

После этого Черепаха поворачивает налево и смещается ещё на 24 единицы.

Повернувшись направо на 90 градусов, она приступает ко второй фигуре. Нам важно, что одна сторона пересечения совпадает со стороной второй фигуры и имеет длину 18.

Осталось лишь найти вторую сторону пересечения. На изображении она отмечена синим цветом.

Найти её несложно: из меньшей стороны первой фигуры, равной 39, вычитаем первое перемещение Черепахи с поднятым хвостом, равное 27.

В итоге получим, что длина искомой стороны пересечения равна 12.

Теперь найдём площадь объединения. Складываем площади обеих фигур и вычитаем площадь пересечения, чтобы не учитывать её дважды: 39 × 48 + 29 × 18 − 18 × 12 = 2178.

Ответ: 2178.

На этом мы закончили разбор алгоритма решения 6 заданий ЕГЭ по информатике. А попрактиковаться в решении заданий данного типа вы можете в нашем тренажёре.

Разберём эту тему на бесплатном пробном занятии

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

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