valid rectangle
倒腾了半天,博客终于在admis也work了,距离上一篇似乎有些时日了刷些存在感。。。
输入四条用两个端点坐标表示的线段,判断是否为合法的面积大于0的矩阵
#include <stdio.h>
#include <algorithm>
using namespace std;
struct line
{
int x1,x2;
int y1,y2;
bool nonlimitedk;
double k;
double b;
line(): x1(0), y1(0),x2(0),y2(0),nonlimitedk(false),k(0)
{
}
};
line rec[4];
bool comp(line l1, line l2)
{
if(l1.nonlimitedk==false && l2.nonlimitedk==false)
return l1.k<l2.k;
else if(l1.nonlimitedk==false && l2.nonlimitedk==true)
return true;
else if(l1.nonlimitedk==true && l2.nonlimitedk==false)
return false;
else
return false;
}
bool quadrangle();
double Length(int i)
{
return (rec[i].x1-rec[i].x2)*(rec[i].x1-rec[i].x2)+(rec[i].y1-rec[i].y2)*(rec[i].y1-rec[i].y2);
}
bool AllHasLength()
{
for(int i=0;i<4;i++)
{
if(Length(i)<=0)
return false;
}
return true;
}
int T;
bool paralle()
{
if(AllHasLength()==false)
return false;
if(rec[0].nonlimitedk==false && rec[1].nonlimitedk==false && rec[2].nonlimitedk==false && rec[3].nonlimitedk==false)
{
if(rec[0].k==rec[1].k && rec[2].k==rec[3].k)
{
if(rec[0].k*rec[2].k==-1 && rec[0].b!=rec[1].b && rec[2].b!=rec[3].b && Length(0)==Length(1) && Length(2)==Length(3))
return true;
else
return false;
}
else
return false;
}
else if(rec[0].nonlimitedk==true && rec[1].nonlimitedk==true && rec[2].nonlimitedk==false && rec[3].nonlimitedk==false)
{
if(rec[2].k==rec[3].k && rec[2].k==0 && rec[2].b!=rec[3].b && rec[0].x1!=rec[1].x1 && Length(0)==Length(1) && Length(2)==Length(3))
return true;
else
return false;
}
else if(rec[0].nonlimitedk==false && rec[1].nonlimitedk==false && rec[2].nonlimitedk==true && rec[3].nonlimitedk==true)
{
if(rec[0].k==rec[1].k && rec[0].k==0 && rec[0].b!=rec[1].b && rec[2].x1!=rec[3].x1 && Length(0)==Length(1) && Length(2)==Length(3))
return true;
else
return false;
}
else if(rec[0].nonlimitedk==true && rec[1].nonlimitedk==true && rec[2].nonlimitedk==true && rec[3].nonlimitedk==true)
{
return false;
}
else
return false;
}
bool rectangle()
{
if(quadrangle()==false) return false;
sort(rec,rec+4,comp);
return paralle();
}
void Swap(line& l1,line& l2)
{
line tmp;
tmp=l1;
l1=l2;
}
bool quadrangle()
{
int curx,cury;
curx=rec[0].x1;cury=rec[0].y1;
for(int i=0;i<4;i++)
{
for(int j=i+1;j<4;j++)
{
if(rec[j].x1==curx && rec[j].y1==cury)
{
curx=rec[j].x2,cury=rec[j].y2;
Swap(rec[j],rec[i+1]);
break;
}
if(rec[j].x2==curx && rec[j].y2==cury)
{
curx=rec[j].x1,cury=rec[j].y1;
Swap(rec[j],rec[i+1]);
break;
}
}
}
if(curx==rec[0].x2 && cury==rec[0].y2)
return true;
else
return false;
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
for(int i=0;i<4;i++)
scanf("%d%d%d%d", &rec[i].x1,&rec[i].y1,&rec[i].x2,&rec[i].y2);
for(int i=0;i<4;i++)
{
if(rec[i].x1!=rec[i].x2)//k != wuqiiong
{
rec[i].nonlimitedk=false;
rec[i].k=double(rec[i].y2-rec[i].y1)/(rec[i].x2-rec[i].x1);
rec[i].b=rec[i].x1-(double(rec[i].x2-rec[i].x1)*rec[i].y1/(double)(rec[i].y2-rec[i].y1));
}
else
{
rec[i].nonlimitedk=true;
rec[i].b=rec[i].x1;
}
}
if(rectangle())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}