计算几何入门之凸包

hhw学长挂的一个简单凸包问题,然后我爆了…因为没学过
然后去看了看发现还不算难,蛮简单的
这个讲的详细
我就只挂一下自己的写法吧,多熟悉熟悉
在这里插入图片描述
很明显需要求出一个凸包,然后计算周长,x轴不需要考虑,所以不需要加上x轴的距离,套一个板子求出点的集合就OK了

struct Point{
    double x,y;
};
double cross(Point a1,Point b1,Point a2,Point b2){
    double xx1=b1.x-a1.x;
    double xx2=b2.x-a2.x;
    double yy1=b1.y-a1.y;
    double yy2=b2.y-a2.y;
    return xx1*yy2-xx2*yy1;
}
bool cmpx(Point a,Point b){
    if(a.x==b.x){
        return a.y<b.y;
    }else{
        return  a.x<b.x;
    }
}
vector<Point> convex_hull(vector<Point>p,int n){
    sort(p.begin(),p.end(),cmpx);
    int k=0;
    vector<Point>q(2*n);

    rep(i,0,n-1){
        while(k>1&&cross(q[k-1],q[k-2],p[i],q[k-1])<=0){
            k--;
        }
        q[k++]=p[i];
    }
    int t=k;
    per(i,n-2,0){
        while(k>t&&cross(q[k-1],q[k-2],p[i],q[k-1])<=0){
            k--;
        }
        q[k++]=p[i];
    }
    q.resize(k-1);
    return q;
}
double get_dis(Point a,Point b){
    return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}
void solve(){
    int n;
    double m,L;
    scanf("%d %lf %lf",&n,&m,&L);
    vector<Point>p;
    Point tmp;
    tmp.x=0.0,tmp.y=0.0,p.pb(tmp);
    tmp.x=m,tmp.y=0.0,p.pb(tmp);
    n+=2;
    rep(i,3,n){
        scanf("%lf %lf",&tmp.x,&tmp.y);
        p.pb(tmp);
    }
    vector<Point>q=convex_hull(p,n);
    double dis=0;
    sort(q.begin(),q.end(),cmpx);
    //dis+=m;
    int sz=q.size();
    rep(i,0,sz-2){
        dis+=get_dis(q[i],q[i+1]);
        if(dis>L){
            break;
        }
    }
    //de(dis);
    if(dis<=L){
        puts("Supreme Golden Joe");
    }else{
        puts("Overlord");
    }
}

猜你喜欢

转载自blog.csdn.net/leoxe/article/details/105835513