
Write a program that determines whether a figure, drawn with dots, is left-right symmetric or not. The dots are all distinct.
Input
The input consists of T test cases. The number of test casesT is given in the first line of the input file. The first line of each test case contains an integerN , where N (1N
1, 000) is the number of dots in a figure. Each of the following N lines contains the x-coordinate andy-coordinate of a dot. Both x-coordinates and y-coordinates are integers between -10,000 and 10,000, both inclusive.
Output
Print exactly one line for each test case. The line should contain `YES' if the figure is left-right symmetric. and `NO', otherwise.
The following shows sample input and output for three test cases.
Sample Input
3 5 -2 5 0 0 6 5 4 0 2 3 4 2 3 0 4 4 0 0 0 4 5 14 6 10 5 10 6 14
Sample Output
YES NO YES
输入一些点,判断是否有一条竖着的直线让所有点关于这条直线对称。
题目很简单,是个十足的水题,我分成了点的个数位偶数和奇数两种情况。
关键是注意sort函数的判断函数的写法(cmp1,cmp2),让在对称轴左边的点按X和Y从小到大排列,对称轴右边的先按X从小到大,再按Y从大到小,方便主函数处理。
#include <iostream> #include <algorithm> using namespace std; struct point { double x; double y; }; bool cmp1(point a0,point b0) { if (a0.x!=b0.x) { return (a0.x<b0.x); } else if (a0.x==b0.x) { return (a0.y<b0.y); } return false; } bool cmp2(point a0,point b0) { if (a0.x!=b0.x) { return (a0.x<b0.x); } else if (a0.x==b0.x) { return (a0.y>b0.y); } return false; } int main() { int i,t,flag,n,ii; double dui; point p[1002]; cin>>t; for (ii=0;ii<=t-1;ii++) { cin>>n; for (i=0;i<=n-1;i++) { cin>>p[i].x>>p[i].y; } flag=1; sort(p,p+n,cmp1); if (n%2==1) { dui=p[n/2].x; sort(p+n/2,p+n,cmp2); for (i=0;i<=n/2-1;i++) { if ((p[n/2].x-p[i].x==p[n-i-1].x-p[n/2].x&&p[i].y==p[n-i-1].y)||(p[i].x==dui)) { continue; } else { flag=0; break; } } } else if (n%2==0) { sort(p+n/2,p+n,cmp2); dui=(p[(n/2)-1].x+p[n/2].x)/2; for (i=0;i<=n/2-1;i++) { if ((dui-p[i].x==p[n-i-1].x-dui&&p[i].y==p[n-i-1].y)||(p[i].x==dui)) { continue; } else { flag=0; break; } } } if (flag==0) { cout<<"NO"<<endl; } else if (flag==1) { cout<<"YES"<<endl; } } return 0; }