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) 编辑 收藏 举报