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 <bits/stdc++.h>
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; 
}
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章