1451. Симметрия точек
На плоскости задано n разных точек P1, P2,
…, Pn. своими координатами
(xi, yi), i = 1, …,
n. Преобразование S производится
следующим образом: для каждой точки X0 плоскости сначала строится
точка X1, симметричная ей относительно P1, потом строится
точка X2, симметричная X1 относительно P2, и
так далее пока не будет построена точка Xn,
симметричная Xn-1 относительно
Pn. Если при описанном
преобразовании S существует единственная точка, которая не изменяет своих
координат (неподвижная точка), то вывести ее координаты. Если существует более
одной неподвижной точки, то вывести 0. Если неподвижных точек не существует,
вывести -1.
Вход. Первая строка содержит количество точек n. Следующие n строк
содержат целочисленные координаты точек (xi,
yi), i = 1, …, n.
Выход. Вывести координаты неподвижной точки (x, y), если она
единственна. Если существует более одной неподвижной точки, то вывести 0. Если
неподвижных точек не существует, вывести -1.
Пример входа
Sample 1
4
0 0
0 1
1 1
1 0
Sample 2
3
0 0
0 1
1 0
Sample 3
4
0 0
1 0
0 1
100 100
Пример выхода
Sample 1
0
Sample 2
1 -1
Sample 3
-1
РЕШЕНИЕ
геометрия
Точка с координатами (x, y)
при симметрии относительно точки (p1,
q1) переходит в точку (2p1 – x, 2q – y1). Если полученную точку
симметрически отобразить относительно (p2,
q2), то получим точку (2p2 – 2p1 + x, 2q2 – 2q1 + y).
Продолжая процедуру отображения n
раз, в конце получим точку с координатами (2pn–
2pn-1 + 2pn-2 – … + (-1)nx, 2qn– 2qn-1
+ 2qn-2 – … +
(-1)ny). Ее координаты
должны совпадать с координатами исходной точки, то есть
x = 2pn – 2pn-1 + 2pn-2 – … + (-1)nx
y = 2qn– 2qn-1 + 2qn-2 – … + (-1)ny
Для нахождения координат искомой
неподвижной точки (x, y) достаточно решить систему двух
линейных уравнений. Если n нечетно,
то система всегда имеет единственное решение:
x = pn – pn-1 + pn-2 – … + p1
y = qn – qn-1 + qn-2 – … + q1
При четном n переменные x и y сокращаются, и оба уравнения
превращаются в равенства:
0 = pn – pn-1
+ pn-2 – … – p1
0 = qn – qn-1
+ qn-2 – … – q1
Если оба равенства истины, то
любая точка плоскости является неподвижной. Если хотя бы одно равенство не
верно, то неподвижных точек не существует.
В переменной pp будем вычислять значение p1
– p2 + p3 – … + (-1)npn, а в переменной
qq значение q1 – q2
+ q3 – … + (-1)nqn.
scanf("%d",&n);
pp = qq = 0; dir = 1;
for(i = 0; i < n; i++)
{
scanf("%d %d",&p,
&q);
pp += p * dir; qq += q * dir;
dir = -dir;
}
Если n нечетно, то выводим неподвижную точку
(pp, qq).
if (n % 2) printf("%d
%d\n",pp,qq);else
{
Если
n четно, то лишь при (pp, qq)
= (0, 0), то любая точка плоскости является неподвижной. Если хотя бы одно из
значений pp или qq отлично от нуля, то неподвижных точек нет.
if (pp || qq) printf("-1\n");
else printf("0\n");
}