hiho 1040 : 矩形判断

#1040 : 矩形判断

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

#include 
using namespace std;
typedef long long ll ;
typedef double    dl ;
#define INF 0x7f
const int maxn =1e5+5; 
const int mod = 1000000007;  
#define f(i,l,r) for(int i=l;i<=r;++i)
#define g(i,l,r) for(int i=l;i>=r;--i)
struct node{
	int x1, y1,x2,y2;
};
struct point{
	int x,y;
};
node p[5];


void init()
{ 
	 
	f(i,1,4)
		cin>>p[i].x1>>p[i].y1>>p[i].x2 >>p[i].y2;  
}
bool jdugepoint()
{
	set<pair<int,int> > s;
 	f(i,1,4)
 	{
 		s.insert(make_pair(p[i].x1,p[i].y1));
 		s.insert(make_pair(p[i].x2,p[i].y2)); 
 	}
	 return s.size()==4; 
}
bool jdugeline()
{
	 f(i,2,4)
	 {
	 	if((p[i].y2-p[i].y1)*(p[1].y2-p[1].y1)==(p[i].x2-p[i].x1)*(p[1].x2-p[1].x1))
	 	continue;
	 	if((p[i].y2-p[i].y1)*(p[1].y2-p[1].y1)==-(p[i].x2-p[i].x1)*(p[1].x2-p[1].x1))
	 	continue;
 
	 	return false;
	 }
	 return true;
}
void slove()
{
	if(jdugepoint())
	{
	  	if(jdugeline())
		{
			cout<<"YES"<<endl;
			return ;
		}
	}
	cout<<"NO"<<endl;
}
int main()
{
     
    freopen("in","r",stdin);
  
    int n;
    cin>>n;
    while(n--)
    {
    	init();

    	slove();
    }
   
    return 0; 
}
 


你可能感兴趣的:(hiho)