[hihoCoder]矩形判断
#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
题目链接:http://hihocoder.com/problemset/problem/1040
解题思路:首先判断四个线段是否可以构成四边形,在判断构成的四边形是不是矩形。即用一个结构体存向量的x,y,只要判断有三个向量有两个相等并且有两个平方和等于另外一个平方就可以判断是矩形了;
AC代码:
#include<stdio.h> #include<math.h> struct Point { int x,y; }p[10]; struct Dis { int xx,yy; }dis[10]; int judge() { if(abs(dis[0].xx)==abs(dis[1].xx)&&abs(dis[0].yy)==abs(dis[1].yy)&&dis[0].xx*dis[2].xx+dis[0].yy*dis[2].yy==0&&dis[0].xx*dis[3].xx+dis[0].yy*dis[3].yy==0) return 1; if(abs(dis[0].xx)==abs(dis[2].xx)&&abs(dis[0].yy)==abs(dis[2].yy)&&dis[0].xx*dis[1].xx+dis[0].yy*dis[1].yy==0&&dis[0].xx*dis[3].xx+dis[0].yy*dis[3].yy==0) return 1; if(abs(dis[0].xx)==abs(dis[3].xx)&&abs(dis[0].yy)==abs(dis[3].yy)&&dis[0].xx*dis[2].xx+dis[0].yy*dis[2].yy==0&&dis[0].xx*dis[1].xx+dis[0].yy*dis[1].yy==0) return 1; return 0; } int main() { int i,j,tcase,len,tt,temp; scanf("%d",&tcase); while(tcase--) { temp=1; for(i=0;i<8;i++) scanf("%d%d",&p[i].x,&p[i].y); for(i=0;i<8;i++) { tt=0; for(j=0;j<8;j++) { if(i==j) continue; else if(p[i].x==p[j].x&&p[i].y==p[j].y) { tt++; if(tt>=2) { temp=0;break; } } } } if(temp) { dis[0].xx=p[0].x-p[1].x;dis[0].yy=p[0].y-p[1].y; dis[1].xx=p[2].x-p[3].x;dis[1].yy=p[2].y-p[3].y; dis[2].xx=p[4].x-p[5].x;dis[2].yy=p[4].y-p[5].y; dis[3].xx=p[6].x-p[7].x;dis[3].yy=p[6].y-p[7].y; if(judge()) printf("YES\n"); else printf("NO\n"); } else printf("NO\n"); } return 0; }