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.平行四边形定义:两对边平行的四边形),代码注释中有详解。

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;
}


你可能感兴趣的:(算法)