nyoj1228矩形判断

描述

给出平面上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条线段是否恰好围成矩形。
样例输入
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

思路:
我是根据矩形的定义来的(1.矩形定义:有一个直角的平行四边形;2.平行四边形定义:两对边平行的四边形),代码注释中有详解。
【nyoj1228矩形判断】AC代码:
#include #include 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; }




    推荐阅读