Алгоритм решения задания 6 ЕГЭ по информатике
Навигация по странице
О задании
Задание 6 ЕГЭ по информатике нацелено на определение результатов работы простейших алгоритмов управления исполнителями. Само по себе задание, с точки зрения программирование достаточно простое. От вас, как от программистов, здесь требуется просто переписать представленный в условии алгоритм и построить по нему фигуры.
Но трудности могут возникнуть со второй частью этого задания, где требуется провести некоторый анализ построенных фигур. Для получения верного ответа необходимо помнить базовые геометрические термины, а также внимательно подсчитывать необходимые значения на изображении.
До 2024 года подходов к решению задания 6 было три:
- Использование исполнителя Черепаха в среде Кумир
- Использование графического модуля turtle на языке программирования Python
- Использование аналитического метода решения
В настоящее время среда Кумир уже не является обязательной к наличию на компьютерах при проведении ЕГЭ по информатике. А аналитический метод порой требует более значительных знаний по геометрии, а также при использовании такого подхода легче ошибиться в расчётах.
Мы же остановимся на визуализации работы алгоритмов, предложенных в задании 6, с помощью модуля turtle в Python. Это более наглядный метод, а сам по себе программный код для решения этого задания является типовым. Даже если вы забудете какую-то его часть, то всегда сможете самостоятельно дойти реализации тех же подходов, просто используя документацию к данному модулю (она доступна по умолчанию при использовании языка Python).
Формулировки
Условие задания 6 ЕГЭ по информатике обычно начинается с описания команд исполнителя и базовой информации о записи циклов с примером алгоритма.
Далее идет непосредственно тот алгоритм, который вам необходимо реализовать. Напомним, что фраза «Повтори k» означает, что вам необходимо запустить цикл for
с k
итерациями. После команды «Вперёд» идет расстояние в пикселях, в после команд поворотов «Направо» и «Налево» идёт угол поворота в градусах. Фразы «Поднять хвост» и «Опустить хвост», соответственно, означают начало отрисовки линии (поднять перо) и конец отрисовки (опустить перо).
И после определения алгоритма как раз и идут те формулировки, которые определяют, что именно вам необходимо дать в ответ. Рассмотрим их подробнее.
Пересечение и объединение фигур
Итак, давайте вспомним, что обозначает пересечение двух фигур. Предположим, у нас есть расчерченное поле, сторона клетки у нас составляет одну условную единицу.
На поле есть две фигуры:
- Оранжевый прямоугольник с номером 1
- Зелёный прямоугольник с номером 2
Теперь давайте сдвинем каждую фигуру на одну клетку в центр. Получим теперь, условно, три фигуры: часть первой, часть второй и третья фигура, которая является «наложением» первых двух.
Этот третий прямоугольник и будет являться пересечением фигур 1 и 2. Таким образом, пересечение двух прямоугольников — это часть плоскости, которая принадлежит одновременно обоим прямоугольникам.
Здесь не зря сделан акцент на слово «одновременно». Ключевую роль это сыграет при определении объединения фигур.
Объединением двух фигур называется фигура, состоящая из всех точек двух фигур. То есть все фигуры вместе — 1, 2 и 3 — дают нам объединение фигур 1 и 2.
А теперь давайте рассмотрим ту же самую картину, но не с позиции фигур на ней, а с позиции точек, принадлежащих этим фигурам.
С пересечением все просто: мы видим некую область, которая принадлежит обеим фигурам (жёлтая). Подсчитать, сколько точек принадлежит пересечению несложно, здесь получим 9 точек.
Куда интереснее ситуация обстоит с объединением фигур.
До момента пересечения, у каждой из фигур было по 20 точек (5 на длине и 4 на ширине прямоугольника). Но после пересечения у каждой из фигур осталось по 11 точек. А вместо 18 точек, которые принадлежали раньше обоим фигурам (по 9 у каждой) теперь осталось только 9, которые принадлежат пересечению фигур.
Этот момент крайне важно осознать. В реальных заданиях 6 могут быть достаточно большие фигуры, а подсчёт точек вручную — процесс довольно муторный. Проще будет перемножить количество точек на сторонах (длине и ширине) каждого прямоугольника, получив тем самым общее количество точек, принадлежащих этой фигуре.
Для подсчёта количества точек объединения фигур мы не можем просто сложить количество точек каждой их этих фигур. Ведь мы помним, что у нас есть еще общие точки на пересечении. Следовательно, необходимо из суммы количества точек этих фигур вычесть количество точек их пересечения.
Давайте подсчитаем здесь количество точек объединения:
5 · 4 + 5 · 4 – 3 · 3 = 20 + 20 – 9 = 31.
Теперь вернёмся к различным формулировкам задания 6.
Точки внутри пересечения
Одна из формулировок задания 6 звучит следующим образом:
«Определите, сколько точек с целочисленными координатами будут находиться внутри области пересечения фигур, ограниченных заданными алгоритмом линиями, включая точки на границах этого пересечения.»
Здесь сложностей возникнуть не должно, нам необходимо найти пересечение фигур и подсчитать количество точек, принадлежащих пересечению.
Можно это сделать как вручную, так и с помощью формул из геометрии для соответствующих фигур.
Сложнее тут обстоят дела с формулировкой, когда необходимо найти количество точек внутри пересечении, не включая точки на линии.
Например, на данном изображении всего одна точка внутри пересечения фигур, которая не лежит на линии (отмечена синим).
Рассмотрим другую фигуру: здесь у нас зелёный прямоугольник, у которого 7 точек на одной стороне и 5 на другой. Необходимо найти все точки, которые не лежат на линии. Можем сразу посчитать количество «внутренних» точек — умножим 5 на 3.
Точки внутри объединения
Ряд заданий 6 предполагает нахождение точек внутри объединения.
Например, можно встретить такую формулировку:
«Определите, сколько точек с целочисленными координатами будут находиться внутри объединения фигур, ограниченных заданными алгоритмом линиями, включая точки на границах этого объединения.»
Решение подобной задачи мы уже рассматривали выше. Нам необходимо найти количество точек, принадлежащих каждой фигуре и их пересечению, перемножить количество точек, принадлежащих фигурам, и отнять от этого произведения количество точек пересечения.
Формулировки данного типа, где необходимо находить точки внутри объединения, обычно не предусматривают исключение точек на линиях из ответа. То есть в данном типа заданий вы не встретите формулировку из разряда «не включая точки на границах этого объединения».
Площадь и периметр фигуры
Ранее мы рассматривали типы задания 6, где работа велась только с точками фигур. Но есть формулировки этого задания, где необходимо найти площадь или периметр фигур, находящихся на пересечении или объединении исходных фигур.
Рассмотрим следующую формулировку:
«Определите площадь области пересечения фигур, ограниченных заданными алгоритмом линиями.»
Для заданий такого типа нам важнее видеть не точки поверх фигуры, а отрезки между этими точками. Этот момент найдет своё отражение в коде, что мы и рассмотрим позднее. На изображениях же мы заменим цвет точек на белый, идентичный цвету фона, что позволит проще различать отрезки между точками.
Разберем тот же самый прямоугольник, у которого 7 точек на одной стороне и 5 на другой. Только теперь нам важны уже не точки, а отрезки между ними.
Следовательно, отрезков у нас 6 и 4. Значит и длины сторон у нас тоже 6 и 4 единиц. Тогда площадь найдем перемножив длину одной стороны на длину другой: 6 · 4 = 24. Периметр находим сложив длины всех стороны: 6 + 4 + 6 + 4 = 20.
Примеры решений
Прежде чем перейдём к решению конкретных примеров, давайте рассмотрим базовые подходы, которые будут присутствовать в каждом решении.
Начнем с кода. Импортировать будем сразу все функции из модуля turtle такой конструкцией:
from turtle import *
Теперь поговорим о базовой настройке отображения окна с графикой. Для начала, отключим анимацию отрисовки командой tracer(0)
.
Далее нам необходимо ввести переменную, отвечающую за масштаб изображения. Её значение нужно будет подбирать вручную, ведь для каждого задания необходим разный масштаб. Можете установить её на значение 20, запустить весь код и проверить, насколько хорошо отображаются все необходимые фигуры.
От масштаба будут зависеть и остальные параметры отображения. Например, мы будем менять размер пера (pensize()
) и размер окна (screensize()
) для лучшего отображения на выбранном масштабе. Также в зависимости от масштаба будем менять значения для переменной размера точек, которые будем расставлять поверх фигур и цвета этих точек.
Когда мы ищем площадь или периметр, цвет точек выбираем белым, а размер побольше. Когда ищем количество точек, цвет выбираем более контрастным (например, тёмно-красный), размер точек выставляем примерно равным размеру линии.
Полный код базовой настройки черепахи с комментариями представлен ниже. Имена для переменных scale
, dot_size
, dot_color
можете выбрать любые.
# Базовая настройка
tracer(0) # Отключаем анимацию
pensize(3) # Размер пера
screensize(2000,2000) # Размер окна
scale = 20 # Масштаб
dot_size = 15 # Размер точек
dot_color = "white" # Цвет точек
lt(90) # Поворот по положительному направлению оси ординат
Для отрисовки точек будем использовать два цикла for
. Значения внутри функции range()
подобраются вручную так, чтобы точки покрывали всю необходимую площадь.
# Точки
for x in range(0,50):
for y in range(0,50):
goto(x * scale, y * scale)
dot(dot_size,dot_color)
В конце вызываем функцию done()
, чтобы предотвратить закрытие окна после завершения работы черепахи.
Подробно работу с модулем turtle мы рассматривали здесь.
Пример 1
Полностью переписывать условие задания здесь не будем, оставим только часть с алгоритмом и той величиной, которую требуется найти.
«Черепаха выполнила следующую программу:
Повтори 2 [Вперёд 24 Направо 90 Вперёд 10 Направо 90]
Вперёд 3 Налево 90 Вперёд 13 Направо 90
Повтори 2 [Вперёд 9 Направо 90 Вперёд 32 Направо 90]
Полученный при выполнении этой программы рисунок можно рассматривать как набор непересекающихся прямоугольников. Определите наибольшую из площадей этих прямоугольников. В ответе запишите только число – наибольшую площадь в условных единицах.»
Базовые настройки здесь следующие:
- Масштаб — 40
- Размер пера — 6
- Размер окна — 2800 на 2800
- Размер точек — 15
- Цвет точек — белый
Первая фигура чертится по этому алгоритму:
Повтори 2 [Вперёд 24 Направо 90 Вперёд 10 Направо 90]
На Python он будет выглядеть так:
for i in range(2):
fd(24 * scale)
rt(90)
fd(10 * scale)
rt(90)
Далее идёт перемещение черепахи следующим алгоритмом:
Вперёд 3 Налево 90 Вперёд 13 Направо 90
На Python он выглядит следующим образом:
up()
fd(3 * scale)
lt(90)
fd(13 * scale)
rt(90)
down()
И вторая фигура чертится так:
Повтори 2 [Вперёд 9 Направо 90 Вперёд 32 Направо 90]
for i in range(2):
fd(9 * scale)
rt(90)
fd(32 * scale)
rt(90)
Полный код данной программы выглядит так:
from turtle import *
# Базовая настройка
tracer(0) # Отключаем анимацию
pensize(6) # Размер пера
screensize(2800,2800) # Размер окна
scale = 40 # Масштаб
dot_size = 15 # Размер точек
dot_color = "white" # Цвет точек
lt(90) # Поворот по положительному направлению оси ординат
color("#A7D380") # Не обязательно
# Первая фигура
for i in range(2):
fd(24 * scale)
rt(90)
fd(10 * scale)
rt(90)
# Перемещение
up()
fd(3 * scale)
lt(90)
fd(13 * scale)
rt(90)
down()
color("#F76D47") # Не обязательно
# Вторая фигура
for i in range(2):
fd(9 * scale)
rt(90)
fd(32 * scale)
rt(90)
# Точки
up()
for x in range(-50,50):
for y in range(-50,50):
goto(x * scale, y * scale)
dot(dot_size,dot_color)
done()
В итоге получаем такое изображение:
Делаем скриншот и открываем в любом графическом редакторе. Теперь пронумеруем каждую фигуру (серые числа) и отметим длины сторон (синие числа).
Сразу видим, что больше всех тут прямоугольник 4 со сторонами 12 и 10. Следовательно, в ответе указываем его площадь — 120.
Пример 2
Далее не будем подробно останавливаться на разборе нашего кода. Меняться будут только значения в циклах и значения базовых настроек. Значения в циклах берутся из условия. Значения настроек будем подбирать вручную, так что у вас эти значения могут отличаться.
Условие следующее:
«Черепахе был дан для исполнения следующий алгоритм:
Повтори 9 [Вперёд 22 Направо 90 Вперед 6 Направо 90]
Поднять хвост
Вперед 1 Направо 90 Вперёд 5 Налево 90
Опустить хвост
Повтори 9 [Вперёд 53 Направо 90 Вперёд 75 Направо 90]
Определите периметр области пересечения фигур, ограниченных заданными алгоритмом линиями.»
Код для решения данного задания следующий:
from turtle import *
# Базовая настройка
tracer(0) # Отключаем анимацию
pensize(6) # Размер пера
screensize(2500,2500) # Размер окна
scale = 40 # Масштаб
dot_size = 15 # Размер точек
dot_color = "white" # Цвет точек
lt(90) # Поворот по положительному направлению оси ординат
color("#A7D380") # Не обязательно
# Первая фигура
for i in range(9):
fd(22 * scale)
rt(90)
fd(6 * scale)
rt(90)
# Перемещение
up()
fd(1 * scale)
rt(90)
fd(5 * scale)
lt(90)
down()
color("#F76D47") # Не обязательно
# Вторая фигура
for i in range(9):
fd(53 * scale)
rt(90)
fd(75 * scale)
rt(90)
# Точки
up()
for x in range(-30,30):
for y in range(-30,30):
goto(x * scale, y * scale)
dot(dot_size,dot_color)
done()
В итоге получаем такое изображение:
Делаем скриншот, для удобства поворачиваем его по часовой стрелке и считаем количество отрезков по обеим сторонам.
Периметр пересечения здесь равен: 21+21+1+1 = 44.
Пример 3
«Черепахе был дан для исполнения следующий алгоритм:
Повтори 3 [Вперёд 7 Направо 90 Вперёд 12 Направо 90]
Поднять хвост
Вперёд 4 Направо 90 Вперёд 6 Налево 90
Опустить хвост
Повтори 4 [Вперёд 83 Направо 90 Вперёд 77 Направо 90]
Определите, сколько точек с целочисленными координатами будут находиться внутри объединения фигур, ограниченных заданными алгоритмом линиями, включая точки на границах этого объединения.»
Здесь код будет практически аналогичен тем, что были представлены в предыдущих примерах. Разве что теперь точки отметим не белым (цветом фона), а более контрастным, например, серым (в формате hex: #696969). И размер точек сделаем поменьше, чтобы сильно не перегружать изображение.
Полный код для построения фигур в этом задании следующий:
from turtle import *
# Базовая настройка
tracer(0) # Отключаем анимацию
pensize(6) # Размер пера
screensize(2500,2500) # Размер окна
scale = 50 # Масштаб
dot_size = 5 # Размер точек
dot_color = "#696969" # Цвет точек
lt(90) # Поворот по положительному направлению оси ординат
color("#A7D380") # Не обязательно
# Первая фигура
for i in range(3):
fd(7 * scale)
rt(90)
fd(12 * scale)
rt(90)
# Перемещение
up()
fd(4 * scale)
rt(90)
fd(6 * scale)
lt(90)
down()
color("#F76D47") # Не обязательно
# Вторая фигура
for i in range(9):
fd(83 * scale)
rt(90)
fd(77 * scale)
rt(90)
# Точки
up()
for x in range(-30,30):
for y in range(-30,30):
goto(x * scale, y * scale)
dot(dot_size,dot_color)
done()
В результате работы программы получаем такое изображение:
Здесь мы отчетливо видим первую фигуру, отмеченную зелёным цветом. Она задана следующим алгоритмом:
Повтори 3 [Вперёд 7 Направо 90 Вперёд 12 Направо 90]
Но вторую фигуру, оранжевую, мы видим лишь частично. Уменьшать масштаб, чтобы она полностью поместилась в экран — бессмысленно. Тем более вручную считать точки у этой фигуры мы точно не будем.
Здесь нам нужно найти количество точек внутри объединения фигур, следовательно, требуется посчитать количество точек, принадлежащих обеим фигурам и количество точек на пересечении. Для первой фигуры это сделать несложно, как и для пересечения фигур. Но как это сделать для второй, большой, фигуры?
Давайте разбираться постепенно. Сначала подсчитаем количество точек зелёной фигуры. С одной стороны у нас 8 точек, с другой 13.
Давайте еще раз взглянем на алгоритм, по которому строилась данная фигура:
Повтори 3 [Вперёд 7 Направо 90 Вперёд 12 Направо 90]
Можно заметить, что количество точек на линии ровно на 1 больше шагов, которые сделала черепаха.
Тогда воспользуемся этой же логикой и вычислим количество точек на сторонах второй фигуры. Алгоритм построения этой фигуры следующий:
Повтори 4 [Вперёд 83 Направо 90 Вперёд 77 Направо 90]
Следовательно, оранжевая фигура имеет на одной стороне 84 точки, а на другой — 78.
Теперь определим количество точек на сторонах пересечения. На одной стороне пересечения 7 точек, а на другой — 4.
Осталось подсчитать количество точек внутри каждой фигуры, просуммировать количество точек каждой фигуры и вычесть из этой суммы количество точке внутри пересечения.
Ответ на это задание будет таким: 13 · 8 + 84 · 78 – 7 · 4 = 6628
Пример 4
«Черепахе был дан для исполнения следующий алгоритм:
Повтори 2 [Вперёд 24 Направо 90 Вперёд 16 Направо 90]
Поднять хвост
Вперёд 10 Направо 90 Вперёд 8 Налево 90
Опустить хвост
Повтори 2 [Вперёд 15 Направо 90 Вперёд 28 Направо 90]
Определите, сколько точек с целочисленными координатами будут находиться внутри пересечения фигур, ограниченных заданными алгоритмом линиями, не включая точки на линиях.»
В привычном нам коде увеличим размер точек и сделаем их цвет более светлым. В остальном код практически не поменялся:
from turtle import *
# Базовая настройка
tracer(0) # Отключаем анимацию
pensize(6) # Размер пера
screensize(3200,2800) # Размер окна
scale = 50 # Масштаб
dot_size = 12 # Размер точек
dot_color = "#898989" # Цвет точек
lt(90) # Поворот по положительному направлению оси ординат
color("#A7D380") # Не обязательно
# Первая фигура
for i in range(2):
fd(24 * scale)
rt(90)
fd(16 * scale)
rt(90)
# Перемещение
up()
fd(10 * scale)
rt(90)
fd(8 * scale)
lt(90)
down()
color("#F76D47") # Не обязательно
# Вторая фигура
for i in range(2):
fd(15 * scale)
rt(90)
fd(28 * scale)
rt(90)
# Точки
up()
for x in range(-30,50):
for y in range(-30,30):
goto(x * scale, y * scale)
dot(dot_size,dot_color)
done()
В результате получаем такое пересечение фигур:
Для больше наглядности выделим красным точки, внутри пересечения, не затрагивая точки на линиях. В все остальные точки на изображении сделаем более светлыми.
Теперь все, что нам необходимо сделать, так это перемножить количество красных точек по горизонтали и по вертикали.
По вертикали точек 13, по горизонтали — 7. Тогда ответом на это задание будет следующее: 7 · 13 = 91