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