给出平面上的n个点,求一条竖直直线使平面上所有点对称,注意是竖直直线。
给所有的点排序,排序后取第一个点作为标准,找其他的点进行匹配,确定一条轴,判断其他点是否关于这个轴对称。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #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; }
|
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **