您的位置:首页 > 其它

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

2017-11-09 09:16 519 查看
题目

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

代码

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj