nyoj1228矩形判断

来源:互联网 发布:股票买卖模拟软件 编辑:程序博客网 时间:2024/06/03 23:39

矩形判断

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形。
输入
输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (-100000 <= x1, y1, x2, y2 <= 100000);其中(x1, y1), (x2,y2)代表一条线段的两个端点。
输出
每组数据输出一行YES或者NO,表示输入的4条线段是否恰好围成矩形。
样例输入
30 0 0 11 0 1 10 1 1 11 0 0 00 1 2 31 0 3 23 2 2 31 0 0 10 1 1 01 0 2 02 0 1 11 1 0 1
样例输出
YESYESNO
思路:
我是根据矩形的定义来的(1.矩形定义:有一个直角的平行四边形;2.平行四边形定义:两对边平行的四边形),代码注释中有详解。

代码长度,运行时间,内存如下

AC代码:

#include <stdio.h>#include <algorithm>using namespace std;struct node{int x, y, cnt;}p[8];int main() {int t, i, j, k;double K[4], max = 1.0/0.0;struct node b[8];scanf("%d", &t);while(t--) {for(i = 0, k = 0; i < 8; i++) {b[i].cnt = 0;scanf("%d%d", &p[i].x, &p[i].y);for(j = 0; j < k; j++) {if(p[i].x == b[j].x && p[i].y == b[j].y) {b[j].cnt++;break;}}if(j == k) {b[k].x = p[i].x;b[k].y = p[i].y;b[k++].cnt++;}if(i%2) K[i/2] = (p[i].y-p[i-1].y+0.0)/(p[i].x-p[i-1].x+0.0);}char fag = 1;if(b[0].cnt!=2||b[1].cnt!=2||b[2].cnt!=2||b[3].cnt!=2) fag = 0;//四条边要构成四边形的话四边形的每个顶点都应该出现两次,否则不是四边形 else {sort(K,K+4);if(K[0] != K[1] || K[2] != K[3]) fag = 0;//判断是否为平行四边形 else {if(K[0]*K[3] != -1) fag = 0;//没有直角则不是矩形 if(K[0]==0&&K[2]==max) fag = 1;//一边斜率为0,一边没有斜率与y轴平行的情况也要考虑 }}if(fag) printf("YES\n");else printf("NO\n");}return 0;}


1 0
原创粉丝点击