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;
}

Posted by richard爱闹 - 8月 17 2014
如需转载,请注明: 本文来自 Richard