UVA 1595 Symmetry(sort的运用)

来源:互联网 发布:淘宝上面最便宜的卫衣 编辑:程序博客网 时间:2024/05/17 05:04

The figure shown on the left is left-right symmetric as it is possible to fold the sheet of paper along avertical line, drawn as a dashed line, and to cut the figure into two identical halves. The figure on the right is not left-right symmetric as it is impossible to find such a vertical line.

\epsfbox{p3226.eps}

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 (1$ \le$N$ \le$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. Bothx-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 105 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;}

                                             
0 0