hihoCoder1040:矩形判断

 #1040 : 矩形判断

时间限制:1000ms
单点时限:1000ms
内存限制:256MB

描述

给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形。

输入

输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000);其中(x1, y1), (x2,y2)代表一条线段的两个端点。

输出

每组数据输出一行YES或者NO,表示输入的4条线段是否恰好围成矩形。

样例输入
3
0 0 0 1
1 0 1 1
0 1 1 1
1 0 0 0
0 1 2 3
1 0 3 2
3 2 2 3
1 0 0 1
0 1 1 0
1 0 2 0
2 0 1 1
1 1 0 1
样例输出
    YES
    YES
    NO
  前几天在hihoCoder上做了这道矩形判断的题,这是一道计算几何的题,是google在线技术笔试模拟题。一开始的时候想得方法太过复杂,这里就不说了,后来发现其实这道题很简单。
  每次输入的是8个点,按照顺序,每两个点构成一条线段,如果能够构成矩形,那肯定也是四边形,四边形实际上只有四个不同的点,那么这8个点必定要有俩俩重复相同的点,也就是实际上是四组点,每一组两个点都是相同点。
  这道题的大致思路是:从第一个点开始,设置为(x_current,y_current),即当前需要查找的点,查找与其相同的点是否存在,如果没有直接输出NO,如果有,则将和(x_current,y_current)相同的那个点所对应用于组成线段的另外一个点标记为(x_current,y_current),然后继续循环查找,已经查找过的相同点需要标记,下次不再查找。
  如果通过上面步骤找出了不同的四个点,并且是按照顺序可以连接成要构成的四边形,那再进行矩形的判断。通过对边平行且相等的定理判断是否是平行四边形(当然也可以通过两组对边平行进行判定),再通过判断邻边是否垂直判断是否是矩形。
  下面贴出我在hihoCoder上AC的代码。
  1 //
  2 //  main.cpp
  3 //  hihoCoder
  4 //
  5 //  Created by chenmingxin on 15/4/1.
  6 //  Copyright (c) 2015年 chenmingxin. All rights reserved.
  7 //
  8 
  9 #include <iostream>
 10 #include <stdio.h>
 11 #include <string.h>
 12 using namespace std;
 13 
 14 //首先每次输入的是8个点,按照顺序,每两个点构成一条线段,如果能够矩形,那肯定也是四边形,四边形实际上只有四个点,那么这8个点必定要有重复的相同的点,也就是实际上是四组点,每一组两个点都是相同点
 15 //这道题的大致思路是:从第一个点开始,设置为(x_current,y_current),即当前需要查找的点,查找与其相同的点是否存在,如果没有直接输出NO,如果有,则将和(x_current,y_current)相同的那个点所对应的组成线段的另外一个点标记为(x_current,y_current),然后继续循环查找,已经查找过的相同点需要标记,下次不再查找
 16 //如果通过上面步骤找出了不同的四个点,并且是按照顺序可以连接成要构成的四边形,那再进行矩形的判断。通过对边平行且相等的定理判断是否是平行四边形,再通过判断邻边是否垂直判断是否是矩形
 17 
 18 int main(int argc, const char * argv[]) {
 19     // insert code here...
 20     //std::cout << "Hello, World!\n";
 21     int T = 0;
 22     int point[8][2];
 23     cin >> T;
 24     int flag = 0;
 25     for(int i =0;i<T;i++){
 26         for(int j=0;j<8;j++){
 27             cin>>point[j][0];
 28             cin>>point[j][1];
 29         }
 30       
 31         flag = 0;
 32         
 33         int point_flag[8];
 34         memset(point_flag,0,sizeof(point_flag));
 35         //将第一个点设置为当前需要查找的点,标记为1,在循环查找与其相同点的时候不能再去判断它本身。
 36         point_flag[0] = 1;
 37       //  point_flag[1] = 1;
 38         int x_current = point[0][0],y_current = point[0][1];//记录当前需要查找的点,也就是找和这个点相同的点
 39         
 40         int reality_point[4][2];//记录实际的点,如果构成了四边形,那总共只能有4个点
 41         memset(reality_point,0,sizeof(reality_point));
 42         reality_point[0][0] = x_current;
 43         reality_point[0][1] = y_current;
 44         int real_num = 1;
 45         for(int m = 0;m<8;m++){
 46             if(!point_flag[m]){
 47                 if(point[m][0]==x_current&&point[m][1]==y_current){
 48                     point_flag[m] = 1;
 49                     if(m%2==0){
 50                         x_current = point[m+1][0];
 51                         y_current = point[m+1][1];
 52                         point_flag[m+1] = 1;
 53                         
 54                     }
 55                     else{
 56                         x_current = point[m-1][0];
 57                         y_current = point[m-1][1];
 58                         point_flag[m-1] = 1;
 59                     }
 60                     if(m-1==0)
 61                         break;
 62                     real_num++;
 63                     if(real_num>4)
 64                         break;
 65                     reality_point[real_num-1][0] = x_current;
 66                     reality_point[real_num-1][1] = y_current;
 67 
 68                     
 69                     m = -1;
 70                     
 71                 }
 72             }
 73             
 74         }
 75         
 76         //已经判断出是四边形了
 77         if (real_num == 4) {
 78             int x1 = reality_point[0][0],y1 = reality_point[0][1];
 79             int x2 = reality_point[1][0],y2 = reality_point[1][1];
 80             int x3 = reality_point[2][0],y3 = reality_point[2][1];
 81             int x4 = reality_point[3][0],y4 = reality_point[3][1];
 82             //判断对边是否平行和相等,这是判断平行四边形的基本定理
 83             int parallel = (y2-y1)*(x4-x3)-(y4-y3)*(x2-x1);
 84             int length1 = (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
 85             int length2 = (x3-x4)*(x3-x4)+(y3-y4)*(y3-y4);
 86             
 87             //如果满足对边平行且相等则可以判断是平行四边形,那接下来就需要判断是否为矩形,通过判断邻边是否垂直来确定
 88             if(parallel == 0&&length1 == length2){
 89                 int vertical = (y3-y2)*(y2-y1)+(x3-x2)*(x2-x1);
 90                 if(vertical == 0)
 91                     flag = 1;
 92             }
 93         }
 94         
 95         
 96         if(flag == 1){
 97             cout<<"YES"<<endl;
 98         }
 99         else
100             cout<<"NO"<<endl;
101     }
102         
103     
104     
105     return 0;
106 }

 

 

posted on 2015-04-05 10:35  RedstoneCMX  阅读(377)  评论(0编辑  收藏  举报