矩形判断

时间限制: 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

思路分析:

      这道题目,思路比较好像,要判断是否是矩阵:1、给出的线段是否只有四个点    2、给出的线段是否两两相等且平行  3、给出的线段不平行的线段是否向量积为0.

#include<iostream>

using namespace std;
int a[10][3];
int b[5][3];
int main()
{
	int t;
	int i=1;
	int flag=0;
	int x1,x2,y1,y2;
	scanf("%d",&t);
	while(i<=t)
	{
		flag=0;
		int j=1;
		int j1; 
		int mini=0;
		while(j<=4)
		{
			scanf("%d%d%d%d",&a[2*j-1][1],&a[j*2-1][2],&a[j*2][1],&a[j*2][2]);
			b[j][1]=a[j*2][1]-a[j*2-1][1];
		
			b[j][2]=a[j*2][2]-a[j*2-1][2];
			if(b[j][1]<0)
			{
				b[j][1]=-b[j][1];
				b[j][2]=-b[j][2];
			}
			j++;
		}
		
		
		//排个序更容易看;
		for(j=1;j<8;j++)
		{
			mini=j;
			for(j1=j+1;j1<=8;j1++)
			{
				if(a[mini][1]>a[j1][1])
				{
					mini=j1;
				}
				else
				{
					if(a[mini][1]==a[j1][1])
					{
						if(a[mini][2]>a[j1][2])
						{
							mini=j1;
						}
					}
				} 
			}
			x1=a[j][1];
			y1=a[j][2];
			a[j][1]=a[mini][1];
			a[j][2]=a[mini][2];
			a[mini][1]=x1;
			a[mini][2]=y1;
		} 
		for(j=1;j<=4;j++)
		{
			if(a[j*2][1]!=a[j*2-1][1]||a[j*2][2]!=a[j*2-1][2])
			{
				flag=1;
			}
			
		}
		
		for(j=1;j<4;j++)
		{
			mini=j;
			for(j1=j+1;j1<=4;j1++)
			{
				if(b[mini][1]>b[j1][1])
				{
					mini=j1;
				}
				else
				{
					if(b[mini][1]==b[j1][1])
					{
						if(b[mini][2]>b[j1][2])
						{
							mini=j1;
						}
					}
				}
			}
			x1=b[j][1];
			y1=b[j][2];
			b[j][1]=b[mini][1];
			b[j][2]=b[mini][2];
			b[mini][1]=x1;
			b[mini][2]=y1;
		}
		for(j=1;j<=2;j++)
		{
			if(b[j*2][1]!=b[j*2-1][1]||b[j*2][2]!=b[j*2-1][2])
			{
				flag=1;
			}
			
		}
		if(b[1][1]*b[3][1]+b[1][2]*b[3][2]!=0)
		{
			flag=1;
		}
		if(flag==1)
		{
			printf("NO\n");
		}
		else
		{
			printf("YES\n");
		}
		i++;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值