不难得出若点集对称,则y轴坐标最大与最小的点互为对称点,对称中心即这两点的中点。然后n^2枚举所有点就行了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define M 10010
const int inf=1<<30;
int x[M],y[M];
int vis[M];
int n;
int main()
{
freopen("in.txt","r",stdin);
int T;
cin>>T;
while(T--)
{
cin>>n;
int maxy=-inf,miny=inf;
int xa,xb;
for(int i=0;i<n;i++)
{
cin>>x[i]>>y[i];
if(y[i]>maxy)
{
maxy=y[i];
xa=x[i];
}
if(y[i]<miny)
{
miny=y[i];
xb=x[i];
}
}
memset(vis,0,sizeof(vis));
int flag=1;
for(int i=0;i<n;i++) if(!vis[i])
{
int x0=xa+xb-x[i];
int y0=maxy+miny-y[i];
for(int j=0;j<n;j++) if(!vis[j])
{
if(x[j]==x0&&y[j]==y0)
{
vis[i]=vis[j]=1;
break;
}
}
if(!vis[i])
{
flag=0;
break;
}
}
if(flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}