Top.Mail.Ru

Алгоритмы управления исполнителями (№ 6)

11 класс

Поделиться статьей:

Informatics

В этой статье рассмотрим алгоритм решения задачи № 6 из ЕГЭ по информатике с помощью библиотеки turtle языка программирования Python.

Термины, которые будем использовать: объединение, пересечение, площадь.

Основные команды исполнителя

Задача № 6 ЕГЭ по информатике на Python с использованием черепашьей графики (turtle) обычно требует исполнителя, который двигается по координатной плоскости и оставляет след. Нужно определить количество точек с целыми координатами, попавших в фигуру, или вычислить её площадь.

from turtle import *

  1. tracer(0) # отключает автоматическую анимацию. Черепаха движется, но на экране ничего не меняется. Все команды движения выполняются «в фоне» очень быстро. Обязательно использовать вместе с update().
  2. update() # принудительно перерисовывает экран, показывая конечный результат.
  3. up() # поднять перо (не рисовать при движении).
  4. down() # опустить перо (рисовать).
  5. goto(x, y) # переместиться в точку (x, y).
  6. forward(d) # вперёд на d пикселей.
  7. backward(d) # назад.
  8. left(angle) # повернуть налево.
  9. right(angle) # направо.
  10. setheading(deg) # установить направление (0 — восток, 90 — север).
  11. dot(size, color) # поставить точку.
  12. screensize(x, y) # устанавливает размер окна x на y пикселей.
  13. exitonclick() # чтобы график закрывался при нажатии на него, а не автоматически при завершении программы.

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

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

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

Объединение двух фигур

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

Пересечение двух фигур
Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

Количество точек и площадь фигуры

Быстрее всего количество точек внутри прямоугольника находится так: считаем точки по длине и по ширине фигуры, а затем перемножаем. Если границы входят в подсчёт — учитываем точки на них; если не входят — берём ближайшие точки внутри.

Площадь фигуры считается не по точкам, а по сторонам: нужно найти длину каждой стороны (она на 1 меньше количества точек на стороне).

Периметр фигуры — это сумма длин сторон.

Периметр объединения
Периметр объединения
Периметр пересечения
Периметр пересечения

Задания

Задание 1

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

У исполнителя существует 6 команд:

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

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

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

Повтори 21 [Вперёд 6 Направо 60]

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

Чтобы начать пользоваться черепахой на Python, сначала импортируем все возможные действия с ней из библиотеки turtle.

Черепаха на Python, в отличие от КуМира, по умолчанию смотрит направо, а не вперёд, как это просят по условию. Поэтому перед выполнением алгоритма нужно повернуть черепаху на 90 градусов влево с помощью функции left() (можно записать как lt()).

Начинаем описывать действия: 21 раз мы будем идти вперёд на 6 с помощью функции forward() (по-другому можно записать fd()), после — вправо на 60 с помощью функции right () (можно её записать просто rt()).

Чтобы поработать с размером экрана и самой фигуры, создадим переменную-константу, на которую мы будем умножать каждое движение (вперёд или назад). Так наша фигура увеличится в какое-то количество раз.

Чтобы увеличить скорость рисования, используем функцию tracer(0) — ноль в скобках задаёт максимальную скорость. Если программа при выполнении сразу же закрывается, в конце добавляем одну из функций: done(), update() или exitonclick(). Последняя из них закрывает окно только после щелчка мышью по рисунку.

Чтобы поставить точки на экран, создадим цикл в цикле для координат x и y (диапазоны подбираем для каждого задания заново, ведь готовый рисунок может смещаться в разные стороны). В каждой точке выполняем goto(x, y), а затем рисуем её функцией dot(): в скобках укажем размер точки (цифрой) и желаемый цвет — в кавычках. Не забываем, что координаты тоже нужно умножить на константу, ведь мы увеличили весь рисунок.

Чтобы рисунок можно было прокручивать, увеличим поле функцией screensize(1000, 1000) (числа в скобках можно увеличивать).

Программа для решения задания:

from turtle import *

tracer(0) # макс. скорость

screensize(2000, 2000)

c = 30 # константа для увеличения рисунка

lt(90) # обязательно направляем черепаху посмотреть вверх!

for i in range(21): # условие задачи

fd(6*c)

rt(60)

up()

for x in range(-20, 20):

for y in range(-20, 20):

goto(x*c,y*c) # определяем места для точек

dot(2, ‘blue’) # ставим точку

update()

exitonclick()

В итоге получим:

Решение 1

Теперь посчитаем точки с целочисленными координатами внутри области, ограниченной построенной линией; точки на самой линии не учитываем. Получаем 90.

Ответ: 90.

Задание 2

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

У исполнителя существует 6 команд:

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

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

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

Направо 45 Повтори 7 [Вперёд 6 Направо 45 Вперёд 12 Направо 135]

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

Программа для решения задания:

from turtle import *

tracer(0) # макс. скорость

c = 30 # масштаб

lt(90) # в Python черепаха смотрит вправо, поэтому поворачиваем

screensize(2000, 2000) # увеличиваем поле

rt(45)

for i in range(7): # программа из задания

fd(6*c)

rt(45)

fd(12*c)

rt(135)

up() # поднимаем хвост, чтобы не рисовать при перемещении

update()

for x in range(-20, 20): # строим точки на плоскости

for y in range(-20, 20):

goto(x*c,y*c)

dot(3, ‘red’)
exitonclick() # чтобы рисунок не закрывался сразу

Решение 2

Ответ: 44.

Задание 3

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

У исполнителя существует 6 команд:

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

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

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

Повтори 9 [Вперёд 29 Направо 90 Вперёд 17 Направо 90]

Поднять хвост

Вперёд 5 Направо 90 Вперёд 1 Налево 90

Опустить хвост

Повтори 9 [Вперёд 64 Направо 90 Вперёд 48 Направо 90]

Определите количество точек внутри пересечения фигур. Точки на линиях следует учитывать.

Программа для решения задания:

from turtle import *

tracer(0) # ускоряем отрисовку

screensize(4000,4000) # размер поля

c = 10 # масштаб

left(90) # разворачиваем голову, чтобы всё было верно

down() # опускаем хвост

for i in range(9):

forward(c * 29)

right(90)

forward(c * 17)

right(90)
up()

forward(5*c)

right(90)

forward(1 * c)

left(90)

down()

for i in range(9):

forward(64*c)

right(90)

forward(48*c)

right(90)
up() # поднимаем хвост, чтобы поставить точки

for x in range(-40, 40):

for y in range(-40, 40):

goto(x * c, y * c) # прыгаем в указанную координату

dot(3, ‘red’) # ставим точку
update() # перерисовываем экран

exitonclick()

В задании нужно найти количество точек внутри пересечения фигур. Запустим приведённый выше код и получим такой рисунок:

Решение 3

Подсчитываем количество точек в пересечении — там, где фигуры накладываются друг на друга, — учитывая точки на линиях пересечения.

Решение 3-1

Ответ: 17 * 25 = 425.

Заключение

Задача № 6 с черепашьей графикой решается по единому шаблону: переносим алгоритм из условия в код, рисуем фигуру, расставляем сетку точек с целыми координатами и считаем нужную область. Главное — не забыть повернуть черепаху на 90° в начале и вызвать update() в конце, иначе рисунок или точки не отобразятся. А при подсчёте всегда внимательно перечитывай условие: учитывать ли точки на границе и что именно ищем — точки внутри фигуры, в их пересечении или объединении. Освоив этот подход, ты сможешь решать практически любой вариант задания № 6.

Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

В 100б ты пробьёшь свой
максимум на экзаменах

наши лучшие курсы

Выбери подходящий курс и предмет, чтобы прокачаться и сдать ОГЭ на «5», а ЕГЭ на 80+ баллов

Выбрать курс

бесплатные материалы

Курсы, вебы, чек-листы — всё за 0 ₽

Забрать за 0 ₽

Интенсив по поступлению

Запишись на интенсив по поступлению, чтобы
взять из ЕГЭ максимум и попасть в вуз мечты

Записаться
В 100балльном репетиторе ты пробьёшь свой максимум на экзаменах

Преимущества подготовки
в 100балльном

10+
лет средний опыт наших преподавателей

18
выпускников сдали ЕГЭ
на 200 из 200 в 2024 году

300k+
учеников поступили в вуз мечты с нашей помощью 

14%
стобалльников России — наши выпускники

2 347
выпускника сдали ЕГЭ на 100 баллов

Преимущества подготовки в 100балльном

Запишись
на бесплатный
вводный урок

Познакомим с преподавателями и платформой

Расскажем про учёбу

Поможем поставить цель

  • 11 класс
  • 10 класс
  • 9 класс
  • 8 класс
  • 7 класс
Запись на вводный урок