5151. Два треугольника

 

Заданы два треугольника: ABC и DEF. Определить, являются ли они подобными.

Вход. Первая строка содержит координаты вершин треугольника ABC: xA, yA, xB, yB, xC, yC. Вторая строка содержит в аналогичном формате координаты вершин второго треугольника. Все числа целые и не превосходят 5000 по абсолютному значению. Оба заданных треугольника имеют ненулевую площадь.

Выход. Выведите YES, если треугольники подобны, и NO в противном случае.

 

Пример входа 1

Пример выхода 1

0 0 1 0 0 1

10 10 12 10 10 12

YES

 

 

Пример входа 2

Пример выхода 2

0 0 1 0 0 1

0 0 10 0 0 5

NO

 

 

РЕШЕНИЕ

геометрия

 

Анализ алгоритма

Отсортируем длины сторон каждого треугольника. Пусть первый треугольник имеет стороны a, b, c (abc), а второй x, y, z (xyz). Тогда треугольники подобны, если a / x = b / y = c / z.

 

Реализация алгоритма

Объявим рабочие массивы. Длины сторон первого треугольника храним в массиве t1, а длины сторон второго – в t2.

 

int x[3], y[3];

long long t1[3], t2[3];

 

Читаем входные данные. Вычисляем длины сторон треугольников.

 

scanf("%d %d %d %d %d %d",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2]);

t1[0] = (x[1] - x[2])*(x[1] - x[2]) + (y[1] - y[2])*(y[1] - y[2]);

t1[1] = (x[0] - x[2])*(x[0] - x[2]) + (y[0] - y[2])*(y[0] - y[2]);

t1[2] = (x[1] - x[0])*(x[1] - x[0]) + (y[1] - y[0])*(y[1] - y[0]);

 

scanf("%d %d %d %d %d %d",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2]);

t2[0] = (x[1] - x[2])*(x[1] - x[2]) + (y[1] - y[2])*(y[1] - y[2]);

t2[1] = (x[0] - x[2])*(x[0] - x[2]) + (y[0] - y[2])*(y[0] - y[2]);

t2[2] = (x[1] - x[0])*(x[1] - x[0]) + (y[1] - y[0])*(y[1] - y[0]);

 

Сортируем длины сторон первого и второго треугольника.

 

sort(t1,t1+3);

sort(t2,t2+3);

 

Треугольники подобны, если имеет место соотношение:

t1[0] / t2[0] = t1[1] / t2[1] = t1[2] / t2[2]

Поскольку a / b = c / d по правилу пропорции эквивалентно a * d = b * c, то указанное равенство эквивалентно двум следующим:

t1[0] * t2[1] = t2[0] * t1[1]

t1[0] * t2[2] = t2[0] * t1[2]

 

if (t1[0] * t2[1] == t2[0] * t1[1] &&

    t1[0] * t2[2] == t2[0] * t1[2])

  puts("YES");

else

  puts("NO");