Олимпиадная информатика - 2010

Разбор и решение задач муниципального уровня 2010-11 года

Задача «Два отрезка»

Два отрезка АВ и CD на плоскости заданы координатами своих концов - точек А, В, С и D. Требуется найти пересечение этих отрезков и вывести: слово Empty, если эти отрезки не пересекаются; координаты точки пересечения, если пересечение состоит из единственной точки; координаты точек - концов отрезка пересечения, если пересечение заданных отрезков является отрезком. Входные данные

Входной файл содержит координаты точек А, В, С и D - целые числа, не превосходящие 1 ООО по абсолютной величине. Отрезки могут быть вырожденными. Выходные данные

Выходной файл должен содержать ответ на задачу в указанном формате. Числа следует выводить не менее чем с 6 знаками после точки.

INPUT.TXT
00 99 95 05
OUTPUT.TXT
5.000000 5.000000

посмотреть текст программы здесь

Разбор задачи №2 "Два отрезка"
предложено Песковым Аркадием Геннадьевичем, МОУ «Сюкеевская средняя общеобразовательная школа»
Камско-Устьинского муниципального района РТ

Решение распадается на 2 принципиально различных случая:

1.Все 4 точки лежат на одной прямой

2.Точки не лежат на одной прямой. В первом случае надо аккуратно рассмотреть все возможные случаи. Для упрощения работы концы отрезков надо отсортировать так, чтобы первая точка была левее(x1<x2), если отрезок параллелен оси ОУ (х1=х2) то, чтобы первая точка была ниже (у1<у2). После этого надо отсортировать отрезки так чтобы первый был левее(x1<x3), если х1=х3 ,то чтобы первый был ниже(y1<y3). В результате число возможных вариантов значительно уменьшается. А)второй отрезок начинается после первого (х2<x3)– общих точек нет. Б)Второй отрезок начинается в концу первого (х2=х3 и у2=у) ответ одна точка Т3 В)второй отрезок начинается внутри первого(х3<x2 или х3=х3 и у3< 2): В1) один из отрезков вырожденный – ответ одна точка Т3, В2) второй отрезок заканчивается внутри первого – ответ отрезок Т3-Т4 В3)конец второго отрезка вне первого отрезка – ответ отрезок Т3-Т2

Если точки на лежат на одной прямой, то сортировка не обязательна, пересечение находим таким образом: Прямая разбивает плоскость на 2 полуплоскости. Если концы отрезка лежат в разных полуплоскостях, то отрезок пересевает прямую, если в одной – не пересекает. 2 отрезка пересекаются если каждый из них пересекает прямую, на которой лежит другой отрезок. Проверить это можно таким образом: если подставить в уравнение прямой координаты точек одной полуплоскости, то получим значения одного знака (на пример положительные).

Координаты точек другой полуплоскости дадут значения другого знака ( в примере - отрицательного). При умножении 2 чисел одного знака имеем положительный результат, разного знака – отрицательный.

Запишем уравнение прямой, проходящей через первую и вторую точки , (x-x1)(y2-y1)-(y-y1)(y2-y1)=0, подставим в его левую координаты третьей и четвёртой и перемножим полученные результаты.

Затем то же проделаем для прямой, проходящей через третью и четвертую точки и точек один и два.

Если в обоих случаях результат неположительный, то отрезки имеют общую точку.

Её координаты найдем, решив соответствующую систему полученных уравнений. Легче сделать это методом Крамера. Прилагаю вариант листинга, в нём все переменные типа REAL.

Можно использовать и целый тип INT64. При использовании типа LONGINT данный вариант программы даёт неверный результат в 2 тестах (№14 и №36), т.к. при умножении получаем выход за допустимый интервал значений.

Hosted by uCoz