POJ3304

来源:互联网 发布:英语软件哪个好 编辑:程序博客网 时间:2024/04/30 06:01

似乎NOI2017考了计算几何。
计算几何这么不OI向的东西,竟然在CCF系列赛事的NOI中考了,感觉有必要学一学啊。
这题本来倒没什么,只是我一开始枚举两个点,直接判下标是否相等。但按照网上各种题解,应该判两个点是否相等。
这可能是做计算几何遇到的第一个坑?

#include<cstdio>#include<cmath>const int N=105;typedef double db;const double eps=1e-8;int dcmp(double x){    if(x>eps)return 1;    if(x<-eps)return -1;    return 0;}struct poi{    double x,y;    poi(double _x=0,double _y=0):x(_x),y(_y){}    bool operator==(const poi&rhs)const{        return fabs(x-rhs.x)<eps && fabs(y-rhs.y)<eps;    }     bool operator!=(const poi&rhs){        return !(*this==rhs);    }    friend double dis(poi a,poi b){        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));    }    inline void in(){        scanf("%lf%lf",&x,&y);    }};struct vec{    double x,y;    vec(double _x=0,double _y=0):x(_x),y(_y){}    bool operator==(const vec&rhs)const{        return fabs(x-rhs.x)<eps && fabs(y-rhs.y)<eps;    }     vec operator+(const vec&rhs){        return vec(x+rhs.x,y+rhs.y);    }    vec operator*(const double p){        return vec(x*p,y*p);    }    vec operator/(const double p){        return vec(x/p,y/p);    }    double len(){        return dis(poi(),poi(x,y));    }    friend double dot(vec a,vec b){        return a.x*b.x+a.y*b.y;    }    friend double cross(vec a,vec b){        return a.x*b.y-a.y*b.x;    }    double angle(){        return atan2(y,x);    }    friend double angle(vec a,vec b){        return acos(dot(a,b)/a.len()/b.len());    }    vec rorate(double rad){        double u=cos(rad),v=sin(rad);        return vec(x*u-y*v,x*v+y*u);    }    //friend    };poi operator+(poi a,vec b){    return poi(a.x+b.x,a.y+b.y);}vec operator-(poi a,poi b ){    return vec(a.x-b.x,a.y-b.y);}poi a[N],b[N],c[N<<1];vec u;int n,i,j,k,xb,T;int main(){    scanf("%d",&T);    while(T--){        scanf("%d",&n);        xb=0;        for(i=1;i<=n;++i)a[i].in(),b[i].in(),c[++xb]=a[i],c[++xb]=b[i];        for(i=1;i<=xb;++i){            for(j=1;j<=xb;++j)if(c[i]!=c[j]){                u=c[i]-c[j];                for(k=1;k<=n;++k)if(dcmp(cross(u,a[k]-c[j]))*dcmp(cross(u,b[k]-c[j]))==1)break;                if(k>n)break;            }            if(j<=xb)break;        }        puts(i<=xb?"Yes!":"No!");    }    return 0;}
原创粉丝点击