POJ 2653 Pick-up sticks <计算几何>

来源:互联网 发布:中国政治体系 知乎 编辑:程序博客网 时间:2024/05/12 10:13

题目

水题。。但是不知道为什么从后往前扫会超时。。

代码

#include <iostream>#include <cmath>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const double EPS=1e-8;const int MAXN=1e5+5;struct Point;typedef Point Vec;int dblcmp(double x){    return fabs(x)<EPS?0:(x>0?1:-1);}struct Point{    double x,y;    Point(){}    Point(double xx,double yy):x(xx),y(yy){}    Vec operator -(Point p){        return Point(x-p.x,y-p.y);    }    double operator ^(Vec v){        return x*v.y-y*v.x;    }};struct Stick{    Point p1,p2;    Stick(){}    Stick(Point pp1,Point pp2):p1(pp1),p2(pp2){}    bool isCross(Stick& s){        return (dblcmp((p2-p1)^(s.p1-p1))^dblcmp((p2-p1)^(s.p2-p1)))==-2&&                (dblcmp((s.p2-s.p1)^(p1-s.p1))^dblcmp((s.p2-s.p1)^(p2-s.p1)))==-2;    }};Stick stick[MAXN];int main(){    //ios::sync_with_stdio(false);    int n;    while(scanf("%d",&n),n){        double x1,y1,x2,y2;        for(int i=0;i<n;++i){            scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);            stick[i]=Stick(Point(x1,y1),Point(x2,y2));        }        printf("Top sticks: ");        for(int i=0;i<n;++i){               int j;            for(j=i+1;j<n;++j){                if(stick[i].isCross(stick[j]))                    break;            }            if(j==n){                if(i==n-1) printf("%d.\n",i+1);                else printf("%d, ",i+1);            }        }    }    return 0;}
原创粉丝点击