zoukankan      html  css  js  c++  java
  • Symmetry

    Description

    The figure shown on the left is left-right symmetric as it is possible to fold the sheet of paper along a vertical 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 cases T is given in the first line of the input file. The first line of each test case contains an integer N , 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 and y-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


    题意:
    给出一张图,图上有一些点,你要做的就是找到一条线可以将这些点对称分开,如果能找到,输出yes,找不到输出no


    思路:
    最重要的一句“The figure on the right is not left-right symmetric as it is impossible to find such a vertical line”,vertical说明只需要垂直的竖线,那就好办多l
    首先随便找到处于同一行的对称两点,通过它们求出中点,那么这条线就找到了。
    然后枚举判断每一行的对称点到这条线的距离是否相等,如果不相等,马上break掉,输出no。
    然后考虑数据结构,因为处在同一行的点你不知道会有多少,所以使用不定长数组vector会比较方便
    再想到如果仅仅就以y为vector数组的下标,后面的枚举会不好进行,所以只需要开一个数组记录一下就好了,y的值是什么并不重要。
    还有就是为了找到同一行对称两点,应该对那一行先排一下序,然后就好找了


    代码:

    #include"iostream"
    #include"cstdio"
    #include"cstring"
    #include"vector"
    #include"algorithm"
    using namespace std;
    const int maxn=10000+10;
    
    vector<int>pile[maxn];
    int book[2*maxn+10];
    int top,flag;
    
    void Init()
    {
        int n;
        cin>>n;
        memset(pile,0,sizeof(pile));
        memset(book,0,sizeof(book));
        top=1;
        int x,y;
        for(int i=0;i<n;i++)
        {
            cin>>x>>y;
            y+=10000;
            if(!book[y]) book[y]=top++;
            pile[book[y]].push_back(x);
        }
    }
    
    void Work()
    {
        sort(pile[1].begin(),pile[1].end());
        int mid=(pile[1][0]+pile[1][pile[1].size()-1])/2;
        flag=0;
        for(int k=1;k<top;k++)
        {
            sort(pile[k].begin(),pile[k].end());
            for(int j=0;j<pile[k].size();j++)
            {
                if(((pile[k][j]+pile[k][pile[k].size()-j-1])/2)!=mid)
                {
                    flag=1;
                    break;
                }
            }
            if(flag) break;
        }
    }
    
    void Print()
    {
        cout<<(flag==1?"NO":"YES")<<endl;
    }
    
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
         Init();
         Work();
         Print();
        }
        return 0;
    }

     

  • 相关阅读:
    解决方法 svn checkout 更改用户名密码/断网续传
    解决方法 cannot be resolved as a type
    解决方法 Syntax error on token "enum", invalid Expression
    使用笔记 Sublime text 持更
    解决方法 cvs或svn上下载的新项目无build path
    解决方法 卸载jdk以及重新安装jdk
    配置笔记 eclipse, jdk, tomcat, maven, mysql, alt+/
    ubantu配置java环境变量
    写给自己的!
    数据设计模式
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/4655447.html
Copyright © 2011-2022 走看看