• nyoj1099 四点坐标判断正方形


    题目要求是给定四个点的坐标,判断是否可以构成正方形

    原题

    样例输入

    1
    1 1
    -1 1
    -1 -1
    1 -1

    样例输出

    Yes

    解题思路:
    因为四个点是乱序,于是想判断四点构成的6边是否有四短两长(四边相等对角线相等),用set存放边长来判断是否只有两种长度,用数组判断长短边的数目
    其实不用set用数组排序也可以。
    问题的坑
    1、不能忽视边为0的情况
    2、不能忽视底边和对角线相等的等腰梯形(三长三短的情况,应该是情况之一QAQ)
    #include <iostream>
    #include<cmath>
    #include <set>
    using namespace std;
    double magic[2][4] = {0};
    double side[6] = {0};//存放6边长度 
    int index = 0;
    //得到两点确定的边长 
    double getLength(int p1,int p2){
        return pow((magic[0][p1]-magic[0][p2]),2)+pow((magic[1][p1]-magic[1][p2]),2);
    }
    //得到相同边长的数目 
    int getSideNum(double s){
        int result = 0;
        for(int i=0;i<6;i++){
            if(side[i]==s){
                result++;
            }
        }
        return result;
    }
    int main(int argc, char** argv) {
        set<double> s;
        int n;
        cin>>n;
        while(n--){
            for(int i=0;i<4;i++){
                for(int j=0;j<2;j++){
                    cin>>magic[j][i];
                }
            }
            index = 0;
            for(int i=0;i<3;i++){
                for(int j=i+1;j<4;j++){
                    s.insert(getLength(i,j));
                    side[index++] = getLength(i,j);
                }
            }    
            if(s.size()!=2){
                cout<<"No"<<endl;
            }else{
                if(*s.begin()*2== *(++s.begin())&&getSideNum(*s.begin())==4&&*s.begin()!=0){
                    cout<<"Yes"<<endl;
                }else{
                    cout<<"No"<<endl;
                }
            }
            s.clear();//记得清空 
        }
        return 0;
    }
    
    
    
     
  • 相关阅读:
    批量重命令文件名称的几种方式
    SecureCRT常用快捷键
    ipv4地址从最后一位按步长递增
    win32
    GDI根据位图和透明度创建蒙版
    git bash的一些使用
    win32
    win32
    win32
    QT
  • 原文地址:https://www.cnblogs.com/zhaoGavin/p/8638555.html
Copyright © 2020-2023  润新知