К содержанию

Подтема 6 из 6 · дополнительный урок

Подсчёт программой

Как посчитать точки программой без рисунка — условием принадлежности и перебором.

Условие принадлежности

Задачу темы можно решить и без рисунка: перебрать целые точки и проверить каждую.

Программа проверяет каждую целую точку условием, записанным по фигурам. Точка лежит в A, если 0 ≤ x ≤ 8 и 0 ≤ y ≤ 6, и в B, если 3 ≤ x ≤ 10 и 2 ≤ y ≤ 7. Для пересечения нужны :

count = 0for x in range(-5, 15):    for y in range(-5, 15):        in_a = 0 <= x <= 8 and 0 <= y <= 6        in_b = 3 <= x <= 10 and 2 <= y <= 7        if in_a and in_b:            count += 1print(count)
30

Точки на линиях учитывают знаки <=; для точек строго внутри берут <. Диапазоны перебора берут с запасом: лишние точки не пройдут условие. Масштаб здесь не нужен — проверяются координаты задачи, а не экрана.

Другие части двух фигур

Другой вопрос о двух фигурах — другое условие в той же программе.

В условииУсловие
в пересеченииin_a and in_b
в объединенииin_a or in_b
в A, но не в Bin_a and not in_b
ровно в однойin_a != in_b
count = 0for x in range(-5, 15):    for y in range(-5, 15):        in_a = 0 <= x <= 8 and 0 <= y <= 6        in_b = 3 <= x <= 10 and 2 <= y <= 7        if in_a or in_b:            count += 1print(count)
81

Это те же 63 + 48 − 30 из подтемы 3: программа не складывает фигуры, а проверяет каждую точку один раз, поэтому общие точки не удваиваются.

Треугольник программой

Для наклонных сторон условие берут из уравнений сторон. У треугольника со стороной 8 нижняя сторона лежит на прямой y = x / √3, верхняя — на y = 8 − x / √3. Точка строго внутри, если она между ними и правее оси:

import math count = 0for x in range(1, 8):    for y in range(1, 8):        low = x / math.sqrt(3)        if low < y < 8 - low:            count += 1print(count)
24

Получилось то же 24, что и по столбцам в подтеме 5. Столбец x = 7 программа тоже проверила, но в нём нет ни одной точки: там нижняя сторона выше верхней.

Наименьший параметр

Алгоритм «Повтори 2 [Вперёд A Направо 90 Вперёд 6 Направо 90]» из (0; 0) вверх рисует прямоугольник шириной 6 и высотой A. При каком наименьшем натуральном A внутри будет не менее 40 точек? Точки на линиях не учитывать.

Неизвестное в команде перебирают по возрастанию: первое подходящее значение и есть наименьшее.

for A in range(1, 20):    count = 0    for x in range(0, 7):        for y in range(0, A + 1):            if 0 < x < 6 and 0 < y < A:                count += 1    if count >= 40:        print(A, count)        break
9 40

останавливает перебор на первом подходящем A. Неравенство берут из условия дословно: «не менее 40» — >=, «больше 40» — >. При «больше 40» ответ был бы 10: при A = 9 точек ровно 40.

При A = 9: пять столбцов по 8 точек, ровно 40 — первое A, при котором выполнено «не менее 40».

Наибольшее пересечение

Первая фигура — прямоугольник 0 ≤ x ≤ 8, 0 ≤ y ≤ 6. Вторая — квадрат 7 × 7, его левый нижний угол (p; q) можно поставить в любую целую точку. Сколько наибольшее число целых точек в пересечении вместе с границей?

По каждой оси общая часть не длиннее меньшей из двух сторон. По высоте прямоугольник ниже квадрата: общая часть не длиннее 6. По ширине — не длиннее 7. Значит, точек не больше (7 + 1)(6 + 1) = 56, и это достигается, например, при (p; q) = (1; −1).

Квадрат 7 × 7 (пунктир) при (p; q) = (1; −1): по ширине общая часть 7, по высоте 6 — больше быть не может.

Перебор всех положений подтверждает оценку. Границы общей части — те же максимумы и минимумы, что в подтеме 3:

best = 0for p in range(-8, 9):    for q in range(-8, 9):        left, right = max(0, p), min(8, p + 7)        low, high = max(0, q), min(6, q + 7)        if left <= right and low <= high:            n = (right - left + 1) * (high - low + 1)            best = max(best, n)print(best)
56

Итого

  • Переборвсе целые точки с запасом, в координатах задачи без k
  • Границастрого внутри — <, с границей — <=
  • Две фигурыand, or, and not, !=
  • Наклонусловие из уравнений сторон
  • Параметрперебор по возрастанию, неравенство дословно

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Запиши на Python условие «точка строго внутри прямоугольника 0 ≤ x ≤ 9, 0 ≤ y ≤ 4».
ОтветСкрыть ответ
Ответ
0 < x < 9 and 0 < y < 4: строго внутри — знаки без равенства.
Вопрос 2
Почему программа с условием in_a or in_b не считает общие точки дважды?
ОтветСкрыть ответ
Ответ
Она проверяет каждую точку один раз: точка из обеих фигур добавляет к счётчику одну единицу.
Вопрос 3
Почему в условие принадлежности не добавляют масштаб k?
ОтветСкрыть ответ
Ответ
Условие проверяет координаты задачи; масштаб нужен только для рисунка на экране.
Вопрос 4
Внутри прямоугольника 6 × A строго 5(A − 1) точек. При каком наименьшем A их больше 40?
ОтветСкрыть ответ
Ответ
10: при A = 9 точек ровно 40 — это не больше 40.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Точки прямоугольника программой

Напиши программу, которая считает целочисленные точки строго внутри прямоугольника 0 ≤ x ≤ 9, 0 ≤ y ≤ 4. Сколько их?

Введите число.

Ровно в одном из прямоугольников

Для прямоугольников A: 0 ≤ x ≤ 8, 0 ≤ y ≤ 6 и B: 3 ≤ x ≤ 10, 2 ≤ y ≤ 7 посчитай программой точки, лежащие ровно в одном из них. Точки на сторонах учитывать.

Введите число.

Треугольник программой

Черепаха находится в начале координат, голова направлена вверх. Она выполняет «Повтори 3 [Вперёд 6 Направо 120]». Напиши программу, которая считает целочисленные точки строго внутри получившегося треугольника. Сколько их?

Введите число.

Наименьшее A: не менее 30 точек

Черепаха находится в начале координат, голова направлена вверх. Ей дали алгоритм «Повтори 2 [Вперёд A Направо 90 Вперёд 4 Направо 90]», где A — натуральное число. При каком наименьшем A внутри области, ограниченной линией, будет не менее 30 точек с целочисленными координатами? Точки на линии не учитывать.

Введите число.

Наименьшее A: больше 60 точек

Черепаха находится в начале координат, голова направлена вверх. Ей дали алгоритм «Повтори 2 [Вперёд A Направо 90 Вперёд 4 Направо 90]», где A — натуральное число. При каком наименьшем A область вместе с линией содержит больше 60 точек с целочисленными координатами?

Введите число.

Квадрат: больше 100 точек внутри

Черепаха находится в начале координат, голова направлена вверх. Ей дали алгоритм «Повтори 2 [Вперёд A Направо 90 Вперёд A Направо 90]», где A — натуральное число. При каком наименьшем A строго внутри будет больше 100 точек с целочисленными координатами?

Введите число.

Наибольшее пересечение

Первая фигура — прямоугольник 0 ≤ x ≤ 10, 0 ≤ y ≤ 4. Вторую фигуру, квадрат 6 × 6 со сторонами вдоль осей, можно поставить так, чтобы его вершины были в целочисленных точках. Какое наибольшее число точек с целочисленными координатами может оказаться в пересечении фигур, если точки на сторонах учитывать?

Введите число.