Вы уже в курсе о том, что задание 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 точек
5) теперь остается повернуть Черепаху на 45° вправо
6) построим прямую равную 8, повернем Черепаху на 135° вправо, и достроим параллелограмм
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:
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) результат работы программы:
8) Ответ: 77.
Полный листинг программы:
Способ 4. Решение c использованием модуля turtle в Python
Выполняем действия аналогично с предыдущему методу:
Получим изображение фигуры. подсчёт точек с целочисленными координатами, оказавшихся внутри контура, проводится визуально.
Способ 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()
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
3) выполнив второй цикл Повтори 2 [Вперёд 17 Направо 90 Вперёд 7 Направо 90] – получим второй прямоугольник
4) для того, чтобы определит количество точек с целочисленными координатами внутри объединения фигур, ограниченного заданными алгоритмом линиями, включая точки на линиях, необходимо найти количество точек в каждом прямоугольнике отдельно, после чего вычесть количество точек, находящихся на их пересечении:
9*19 + 8*18 - 5*8 = 171 + 144 - 40 = 275
либо же можно просто не учитывать область пересечения фигур:
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
листинг программы:
получим необходимое изображение, визуально посчитаем количество точек с целочисленными координатами, которые будут находиться внутри пересечения фигур, ограниченных заданными алгоритмом линиями, включая точки на границах этого пересечения:
Ответ: 55.
Открытый банк заданий ФИПИ E36C92
Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен.
При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения. У исполнителя существует две команды: Вперёд n (где n – целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Направо m (где m – целое число), вызывающая изменение направления движения на m градусов по часовой стрелке.
Запись Повтори k [Команда1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз (где k – целое число).
Черепахе был дан для исполнения следующий алгоритм:
Направо 45 Повтори 7 [Вперёд 5 Направо 45 Вперёд 10 Направо 135].
Определите, сколько точек с целочисленными координатами будут находиться внутри области, которая ограничена линией, заданной алгоритмом. Точки на линии учитывать не следует.
1 Способ. Теоретическое решение
сделав графическое изображение, получим параллелограмм:
Ответ: 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]))
Важно отметить, что для того, чтобы решить данную задачу с помощью программирования зачастую необходимо для начала выполнить теоретическое решение, особенно в задачах, где задана одна фигура, например треугольник или параллелограмм. Так как нужно уравнения прямых, ограничивающих данную фигуру.