题目要求是给定四个点的坐标,判断是否可以构成正方形
样例输入
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; }