Попал ли курсор в хитбокс
Условие
В платформере у каждого объекта есть «хитбокс» — прямоугольник со сторонами, параллельными осям. Игрок кликает мышкой, и игра должна быстро понять: попал ли курсор внутрь хитбокса (граница тоже считается попаданием).
Прямоугольник задан координатами двух противоположных вершин. Они могут быть введены в любом порядке.
Важно: в олимпиадных задачах координаты иногда не помещаются в 32-битный тип, поэтому считайте, что числа надо обрабатывать как 64-битные целые (в Python это не проблема).
Формат ввода
В первой строке записаны четыре целых числа x1 y1 x2 y2 — координаты двух противоположных вершин прямоугольника. Во второй строке записаны два целых числа x y — координаты клика.
Формат вывода
Выведите YES, если точка (x, y) лежит внутри прямоугольника или на его границе. Иначе выведите NO.
Ограничения
-100000 ≤ x1, y1, x2, y2, x, y ≤ 100000- Стороны прямоугольника параллельны осям координат.
- Прямоугольник может быть вырожденным (в отрезок или точку).
Пример
Ввод:
0 0 10 5
3 5
Вывод:
YESКак решать — идея подхода
Приём: Нормализация границ (min/max) + проверка диапазонов
Ключевое наблюдение: вершины прямоугольника могут прийти в любом порядке, поэтому сначала надо «упорядочить» его границы. Так как стороны параллельны осям, попадание точки проверяется независимо по x и по y: точка внутри тогда и только тогда, когда её x между левым и правым краем, а y — между нижним и верхним (границы включаются).
Почему это работает: осевой прямоугольник — это просто декартово произведение двух отрезков: [left, right] по x и [bottom, top] по y. Даже если прямоугольник вырожден (в отрезок или точку), проверка отрезков остаётся корректной.
План:
- Прочитай
x1 y1 x2 y2иx y. - Посчитай границы:
left = min(x1, x2),right = max(x1, x2)bottom = min(y1, y2),top = max(y1, y2)- Проверь условие попадания:
left <= x <= rightиbottom <= y <= top. - Если обе части истинны — печатай
YES, иначеNO.
Сложность: O(1) по времени и O(1) по памяти.
Частая ошибка: использовать строгие неравенства (< вместо <=) и случайно считать клики на границе «мимо».
Разберись руками
Есть прямоугольный хитбокс с вершинами (0,0) и (10,5). Клик сделали в точке (3,5). Нужно понять: точка внутри или на границе.
- Представь сетку точек, где клетка [col,row] — это точка (x=col, y=row). На сетке 12×8 отметь ТРИ точки: две вершины прямоугольника (0,0) и (10,5), и точку клика (3,5).
- Теперь работаем только с осью x. На ленте от 0 до 11 отметь все значения x, которые считаются попаданием по x для этого прямоугольника (границы тоже подходят).
- То же самое по оси y. На ленте от 0 до 7 отметь все значения y, которые считаются попаданием по y (границы тоже подходят).
- Клик был в точке (3,5). 3 есть в разрешённых x, а 5 есть в разрешённых y. Что должна вывести программа?
Идея: Сначала для прямоугольника находишь «левую/правую» границы по x и «нижнюю/верхнюю» по y (даже если вершины даны в любом порядке). Потом отдельно проверяешь, что x точки лежит между границами по x, и y точки — между границами по y. Если оба условия верны, значит точка внутри или на границе.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Олимпиада по информатике: с чего начать — два мира олимпиад — ВсОШ и перечневые: этапы, задания и на каком языке писать
- На программиста по олимпиаде: путь по классам — что даёт диплом, куда с ним берут на ИТ-направления и почему решает 9 класс