Найти тему

Способы решения задания 6 ЕГЭ по информатике

Вы уже в курсе о том, что задание 6 из ЕГЭ по информатике нельзя решать с помощью КуМира?

Открытый банк заданий ФИПИ 19080A

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

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

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

Направо 315 Повтори 7 [Вперёд 16 Направо 45 Вперёд 8 Направо 135].

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

1 Способ. Теоретическое решение

1) в начале Черепаха поворачивается на 315°, так как изначально перед выполнением программы Черепаха стоит в начале координат и смотрит вверх («на север»)

2) тело цикла выполняется 7 раз, то есть, Черепаха три раза обойдёт фигуру и пройдет еще две стороны; важно, что линия замкнётся

3) теперь нужно нарисовать параллелограмм со сторонами 16 и 8 (команды Вперёд 16 и Вперёд 8); это можно сделать, например, на листе в клеточку.

4) Для того, чтобы нарисовать сторону длинной 16, можно провести следующие расчёты:

  • очевидно, что данная сторона проходит под углом 45°, т.е. она является диагональю квадрата
  • пусть клетка имеет длину 1, тогда ее диагональ будет равна sqrt(2)
  • так как длина стороны равна 16, то разделим 16 на sqrt(2), и получим 8*sqrt(2)=11,3
  • тогда проведем прямую под углом 45°, и отметим на ней 11 точек
-2

5) теперь остается повернуть Черепаху на 45° вправо

-3

6) построим прямую равную 8, повернем Черепаху на 135° вправо, и достроим параллелограмм

-4

7) так как у нас получился параллелограмм, то достаточно посчитать только количество целых точек в одном из рядов - их 7, а таких рядов у нас 11, поэтому получим 7*11=77

8) Ответ: 77.

Способ 2. Перебор с помощью программы

1) для составления программы придётся построить систему условий, которая описывает область внутри контура

2) уравнение правой границы параллелограмма: x = 0, нас интересует область x < 0

3) верхняя граница: y = k1*x+8, нас интересует область y < k1*x+8, коэффициент k1 = -tg45 = -1.

4) нижняя граница: y=k2*x, нас интересует область y>k2*x, коэффициент k2=-tg45=-1

5) уравнение левой границы параллелограмма, очевидно, что x = 8*sqrt(2), нас интересует область x > 8*sqrt(2)

6) организуем цикл, в котором перебираем значения x от -12 до 1 и значения y от 0 до 21; для каждой пары (x; y) проверяем все четыре условия; если они выполнены, увеличиваем счетчик count на 1:

-5

7) Ответ: 77.

Способ 3. Решение c использованием модуля turtle в Python + перебор

1) в Python есть стандартный модуль turtle, в котором реализована «черепашья графика»; его можно использовать для того, чтобы построить заданную фигуру.

from turtle import * #подключение модуля Черепаха
from math import *
tracer(2)
#ускорение анимации пера
m = 15 #масштаб
left(90)
# развернуть Черепаху "на север"

переменная m задает масштаб – длину единичного отрезка на плоскости в пикселях

2)  Пропишем алгоритм, заданный в условии задачи

right(315)#вправо на 315
pendown()
#опустить хвост
for i in range(7):
    forward(16 * m)
#вперед на 16 (умножаем на масштаб)
    right(45)
#вправо на 45
    forward(8 * m)
#вперед на 8 (умножаем на масштаб)
    right(135)
#вправо на 135
penup()
#поднять перо

3) аналогично способу 2 организуем цикл, в котором перебираем значения x от -12 до 1 и значения y от -1 до 21; для каждой пары (x; y) проверяем все четыре условия:

count = 0 #количество попавших точек
for x in range (-20,0):
for y in range (0,20):

goto (x * m, y * m) #переместить Черепаху в координатную плоскость
if x < 0 and y > -x and y < -x + 8 and x > -8 * sqrt(2):

4) зададим цвет и толщину точки, если она попала внутрь параллелограмма, и увеличим счётчик count на 1:

dot (3, 'red') # (толщина, цвет – красный) точка находится внутри параллелограмма

count += 1

5) иной цвет зададим для точки, если она не попала внутрь параллелограмма, например, черный

else:

dot (3, 'black') # черная точка не находится внутри параллелограмма

6) выведем счет точек по каждой из колонок, зададим цвет

write(count)

color('red') # количество красных точек по колонкам

mainloop() # создание графического интерфейса

7) результат работы программы:

-6

8) Ответ: 77.

Полный листинг программы:

-7

Способ 4. Решение c использованием модуля turtle в Python

Выполняем действия аналогично с предыдущему методу:

-8

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

-9

Способ 5. С помощью заливки

1) дополним предыдущий код, создав заливку фигуры, написав команду begin_fill() перед алгоритмом, задающим фигуру и end_fill() – после.

from turtle import *
m = 15
tracer(0)
left(90)
pendown()
right(315)
begin_fill()
#начать заливку фигуры
for i in range(10):
#увеличим количество итераций, чтобы Черепаха вернулась в изначальное положение
forward(16 * m)
right(45)
forward(8 * m)
right(135)
end_fill()
#закончить заливку фигуры
penup()

count=0

2) заберем объект нашего поля, для этого используем функцию getcanvas()и занесем ее в переменную canvas:

canvas=getcanvas()

3) снова перебираем все возможные координаты x и y

for x in range (-100,100):

for y in range(-100,100):

4) теперь необходимо понять, что находиться на конкретной точке; для этого для нашего полня есть метод find_overlapping – он возвращает все точки, которые находятся на области:

if canvas.find_overlapping(x*m, y*m, x*m, y*m)==(5,): #передадим левуюверхнюю точку фигуры и правую нижнюю

5) и если мы получаем id объекта, находящегося в области заливки, т.е. (5,), то увеличиваемcount

count+=1
print(count)
#выводим ответ

done()

-10

6) Ответ: 77.

Открытый банк заданий ФИПИ 31EF58

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

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

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

Повтори 2 [Вперёд 8 Направо 90 Вперёд 18 Направо 90]

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

Вперёд 4 Направо 90 Вперёд 10 Налево 90

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

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

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

Теоретическое решение

1) выполнив первый цикл Повтори 2 [Вперёд 8 Направо 90 Вперёд 18 Направо 90] – получим прямоугольник, а Черепаха вернется в исходное положение.

2) переведем Черепаху в новое положение командами Вперёд 4 Направо 90 Вперёд 10 Налево 90

-11

3) выполнив второй цикл Повтори 2 [Вперёд 17 Направо 90 Вперёд 7 Направо 90] – получим второй прямоугольник

-12

4) для того, чтобы определит количество точек с целочисленными координатами внутри объединения фигур, ограниченного заданными алгоритмом линиями, включая точки на линиях, необходимо найти количество точек в каждом прямоугольнике отдельно, после чего вычесть количество точек, находящихся на их пересечении:

9*19 + 8*18 - 5*8 = 171 + 144 - 40 = 275

-13

либо же можно просто не учитывать область пересечения фигур:

9*19 + 8*13 = 171 + 104 = 275.

Ответ: 275.

Открытый банк заданий ФИПИ 73B392

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

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

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

Повтори 2 [Вперёд 10 Направо 90 Вперёд 18 Направо 90]

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

Назад 6 Направо 90 Вперёд 14 Налево 90

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

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

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

Решение c использованием модуля turtle в Python

листинг программы:

-14

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

-15

Ответ: 55.

Открытый банк заданий ФИПИ E36C92

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

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

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

Направо 45 Повтори 7 [Вперёд 5 Направо 45 Вперёд 10 Направо 135].

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

1 Способ. Теоретическое решение

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

-16

Ответ: 27.

Способ 2. Перебор с помощью программы

1) левая граница: y = k1 * x, нас интересует область y < k1 * x, коэффициент k1 = tg45 = 1

2) верхняя граница: y=(5*sqrt(2))/2, нас интересует область y < (5*sqrt(2))/2

3) нижняя граница y = 0, нас интересует область y > 0

4) правая граница y = k1 * x - 10, нас интересует область y > k1 * x - 10, коэффициент k1 = tg45 = 1.

5) напишем другой вариант программы: сначала строится массив из всех пар координат точек, попавших внутрь области, затем выводится длина этого массива:

from math import *
points = [(x,y) for x in range(1,20) for y in range(1,10)
                 if y < x and y < (5*sqrt(2))/2 and y > x - 10 and y > 0]
print(len(points))

6)             вариант решения в одну строну без массива point:

from math import *
print(len([(x,y) for x in range(1,20) for y in range(1,10)
                 if y < x and y < (5*sqrt(2))/2 and y > x - 10 and y > 0]))

Важно отметить, что для того, чтобы решить данную задачу с помощью программирования зачастую необходимо для начала выполнить теоретическое решение, особенно в задачах, где задана одна фигура, например треугольник или параллелограмм. Так как нужно уравнения прямых, ограничивающих данную фигуру.