題意:給你n個(gè)點(diǎn)集合S,問(wèn)你是否存在一個(gè)對(duì)稱點(diǎn),每個(gè)點(diǎn)關(guān)于這個(gè)對(duì)稱點(diǎn)可以找到另外一個(gè)在集合S中的點(diǎn)。對(duì)稱點(diǎn)不能屬于集合S。
解法:對(duì)稱點(diǎn)如果存在必然是這個(gè)n個(gè)點(diǎn)的橫縱坐標(biāo)的平均值,可以證明,然而這是一個(gè)必要條件,還需要對(duì)每個(gè)點(diǎn)進(jìn)行判斷是否存在關(guān)于對(duì)稱點(diǎn)對(duì)稱的集合S中的點(diǎn)。
#include <stdio.h>
#define N 10005
struct Point
{
int x, y;
Point() {};
Point(int _x, int _y)
{
x = _x, y = _y;
}
}p[N];
bool solve(Point &ave, int n)
{
if((ave.x % n) || (ave.y % n)) return 0;
ave.x /= n, ave.y /= n;
for(int i = 0; i < n; i++)
{
int x = 2 * ave.x - p[i].x;
int y = 2 * ave.y - p[i].y;
bool mk = 0;
for(int j = 0; j < n; j++)
{
if(x == p[j].x && y == p[j].y)
{
mk = 1;
break;
}
}
if(!mk) return 0;
}
return 1;
}
int main()
{
int t, n;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
Point ave(0, 0);
for(int i = 0; i < n; i++)
{
scanf("%d %d", &p[i].x, &p[i].y);
ave.x += p[i].x, ave.y += p[i].y;
}
if((n == 1) || solve(ave, n)) puts("yes");
else puts("no");
}
return 0;
}