Геометрия




Точка пересечения прямых:
a1, b1, c1 - коэффициенты первой прямой
a2, b2, c2 - коэффициенты второй прямой
x, y - точка пересечения
 
x = -(c1 * b2 - c2 * b1)/(a1 * b2 - a2 * b1)
y = -(a1 * c2 - a2 * c1)/(a1 * b2 - a2 * b1)
 
Мы уже знаем как проверять прямые на пересечение (они не параллельны) и находить точку их пересечения
 
Теперь научимся делать это с отрезками: 
 
Для начала научимся просто проверять их на пересечение:
Отрезки пересекаются, если концы одного находятся по разные стороны от другого и наоборот (это легко проверяется векторным произведением)
Единственный случай, когда это не сработает - когда отрезки лежат на одной прямой
Для него нужно сделать проверку на пересечение т.н. bounding box (ограничивающий прямоугольник отрезка) - проверяем на пересечение проекции отрезков на оси X и Y
 
Теперь, когда мы умеем проверять отрезки на пересечение, научимся находить точку (или отрезок) их пересечения:
-Если они не пересекаются, то понятно, что такой точки не существует;
-Иначе построим прямые, на которых лежат эти отрезки
Если они параллельны, то отрезки лежат на одной прямой, и нам надо найти отрезок пересечения - от максимальной из левых границ отрезков до минимальной из правых границ (точка меньше другой точки, если она левее,
в случае равенства X-координаты - если она ниже)
Если же прямые не параллельны, то найдём точку их пересечения и вернём её

Task
Time limit: 1000 ms,
Memory limit: 32 Mb

Недавно Венцеслав прочитал новую книгу по пикапу, и теперь он хочет опробовать свои знания в парке. Для простоты представим парк в виде набора тропинок, которые являются отрезками на плоскости. Венцеслав уже гулял в этом
парке, и знает, какая девушка по какой тропинке гуляет. Проблема в том, что Венцеслав очень ленивый, и гуляет только по одной тропинке. А ещё ему лень узнать, каких девушек он может встретить по пути, и поэтому он попросил 
Вас, своего лучшего друга, помочь ему в этом непростом деле.
 
Входные данные:
В первой строке вводятся координаты концов тропинки (X1, Y1) и (X2, Y2), по которой гуляет Венцеслав (-20 <= X1, Y1, X2, Y2 <= 20).
Во второй строке вводится целое число N - количество тропинок, по которым гуляют девушки (0  <= N <= 5).
В последующих N строках вводятся координаты концов тропинок, по которым гуляют девушки (Xi1, Yi1) и (Xi2, Yi2), по i-ой тропинке гуляет i-ая девушка (-20 <= Xi1, Yi1, Xi2, Yi2  <= 20)
 
Выходные данные:
В первой строке выведите число M - количество девушек, пути которых пересекутся с путём Венцеслава (касание путей считается пересечением).
Во второй строке выведите M чисел - номера девушек, с которыми встретится наш герой. Девушки нумеруются с единицы!
 
Пример:
Входные данные:
0 0 2 2
1
0 2 2 0
Выходные данные:
1
1

Автор: Кашуков Андрей

Auto CHOOSE THE PROGRAMMING NECESSARY LANGUAGE!
Attach the program source file:
or enter the source code in the language:

Rules for designing programs and a list of errors during automatic task verification
           

Results: