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

本文介绍了一种用于检测二维平面上直线段是否相交的算法,并提供了完整的C++代码实现。该算法通过计算向量叉积判断两条直线是否发生交叉。

题目

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

代码

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值