2013年11月15日 星期五

POJ 3304 Segments

[計算幾何:叉積]
Note double指定次數越少越好

#include<stdio.h>
#include<cstring>
#include<cmath>
#define MAX 110
#define EPS 1E-8
using namespace std;
class Point
{
public:
    double x,y;
    Point(){x=0,y=0;}
    void Print(){printf("(%.2lf %.2lf)",x,y);}
};
class Segment
{
public:
    Point aa,bb;
    Segment(){}
    Segment(const Point _aa,const Point _bb):aa(_aa),bb(_bb){}
    void set(Point _aa,Point _bb){aa=_aa,bb=_bb;}
    void Print(){aa.Print();bb.Print();puts("\n");}
};
Segment Sgs[MAX];
int Sgscnt;
double Cross(Point _A,Point _B,Point _O)
{
    return ((_A.x-_O.x)*(_B.y-_O.y)-(_B.x-_O.x)*(_A.y-_O.y));
}
bool Check(Segment sg)
{
    //sg.Print();
    if((abs(sg.aa.x-sg.bb.x)<EPS)&&
        (abs(sg.aa.y-sg.bb.y)<EPS))
        return false;
    for(int lx=0;lx<Sgscnt;lx++)
        if(Cross(sg.aa,sg.bb,Sgs[lx].aa)*Cross(sg.aa,sg.bb,Sgs[lx].bb)>EPS)
            return false;
    return true;
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&Sgscnt);
        for(int lx=0;lx<Sgscnt;lx++)
            scanf("%lf %lf %lf %lf",&Sgs[lx].aa.x,&Sgs[lx].aa.y,&Sgs[lx].bb.x,&Sgs[lx].bb.y);
        bool CHECK=(Sgscnt<3);
        for(int lx=0;lx<Sgscnt&&!CHECK;lx++)
        {
            for(int ly=lx+1;ly<Sgscnt&&!CHECK;ly++)
            {
                if(Check(Segment(Sgs[lx].aa,Sgs[ly].aa))) CHECK=true;
                else if(Check(Segment(Sgs[lx].aa,Sgs[ly].bb))) CHECK=true;
                else if(Check(Segment(Sgs[lx].bb,Sgs[ly].aa))) CHECK=true;
                else if(Check(Segment(Sgs[lx].bb,Sgs[ly].bb))) CHECK=true;
            }
        }
        if(CHECK)
            printf("Yes!\n");
        else
            printf("No!\n");
    }
    return 0;
}

沒有留言:

張貼留言