Заданы два
треугольника: 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 (a ≤ b ≤ c), а второй x, y, z (x
≤ y ≤ z). Тогда треугольники подобны, если 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");