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;
}

 

 
posted @ 2018-03-24 13:23  zhaoGavin  阅读(646)  评论(0编辑  收藏  举报