计算几何专项:UVa 10585

来源:互联网 发布:人工智能专业就业方向 编辑:程序博客网 时间:2024/05/16 06:07

不难得出若点集对称,则y轴坐标最大与最小的点互为对称点,对称中心即这两点的中点。然后n^2枚举所有点就行了。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define M 10010const 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;}