zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
    
     
  • 相关阅读:
    前端知识体系
    DOMContentLoaded与load的区别
    最佳网页宽度及其实现
    一些颜色工具网站
    Firebug入门指南
    CSS中背景图片定位方法
    字符编码笔记:ASCII,Unicode 和 UTF-8
    学JS的书籍
    深入理解定位父级offsetParent及偏移大小
    event——事件对象详解
  • 原文地址:https://www.cnblogs.com/zhaoGavin/p/8638555.html
Copyright © 2011-2022 走看看