UVa 1595 - Symmetry(对比查找)

时间:2022-10-13 14:44:33

给出平面上的n个点,求一条竖直直线使平面上所有点对称,注意是竖直直线。

给所有的点排序,排序后取第一个点作为标准,找其他的点进行匹配,确定一条轴,判断其他点是否关于这个轴对称。

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct point{
    double x,y;
    bool operator < (const point &a)const{
        if(a.y==y) return a.x>x;
        else return a.y>y;
    }
};
vector<point>a;
vector<point>b;
int main(){
    int t;
    double mid=0;
    cin>>t;
    while(t--){
        int n,k=1;
        point p;
        cin>>n;
        while(n--){
            cin>>p.x>>p.y;
            a.push_back(p);
            b.push_back(p);
        }
        if(n==1){
            cout<<"YES"<<endl;
            a.clear();
            b.clear();
            continue;
        }
        sort(a.begin(),a.end());
        for(int i=1;i<a.size();i++){
            if(a[0].y!=a[i].y){
                mid=(a[0].x+a[i-1].x)/2;
                break;
            }
        }
        for(int i=0;i<b.size();i++) b[i].x=2*mid-b[i].x;
        sort(b.begin(),b.end());
        for(int i=0;i<a.size();i++){
            if(a[i].x!=b[i].x||a[i].y!=a[i].y){
                k=0;
                break;
            }
        }
        if(k) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
        a.clear();
        b.clear();
    }
    return 0;
}