UVA 218 - Moth Eradication 计算几何 凸包

来源:互联网 发布:淘宝客服的感想 编辑:程序博客网 时间:2024/06/03 19:38

凸包水题

求凸包   求边长

#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define eps 1e-8using namespace std;struct Point{    double x,y;    Point (double x = 0,double y = 0):x(x),y(y){}};typedef Point Vector;Vector operator -(Vector A,Vector B){    return Vector(A.x-B.x,A.y-B.y);}double Cross(Vector A, Vector B){    return A.x*B.y -A.y*B.x;}int cmp(Point a,Point b){    if(a.x<b.x)return 1;    else if(a.x == b.x && a.y < b.y)return 1;    return 0;}int ConvexHull(Point *s,int n,Point *ch){    sort(s,s+n,cmp);    int m = 0;    for(int i = 0; i < n; i++)    {        while(m >1 && Cross(ch[m-1]-ch[m-2],s[i]-ch[m-2])<= 0)m--;        ch[m++] = s[i];    }    int k = m;    for(int i = n-2; i >=0; i--)    {        while(m > k && Cross(ch[m-1]-ch[m-2],s[i]-ch[m-2]) <= 0)m--;        ch[m++] = s[i];    }    if(n>1)m--;    return m;}double Length(Point a,Point b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}int main(){    #ifdef LOCAL    freopen("in.txt","r",stdin);    #endif // LOCAL    int N;    int T = 1;    while(scanf("%d",&N) != EOF)    {        if(N == 0)break;        struct Point s[N],t[N];        for(int  i = 0; i < N; i++)            scanf("%lf%lf",&s[i].x,&s[i].y);        int m = ConvexHull(s,N,t);        printf("Region #%d:\n",T++);        for(int  i = m; i >= 0 ;i--)        {            printf("(%.1lf,%.1lf)",t[i].x,t[i].y);            if(i > 0)printf("-");        }        printf("\n");        double dis = 0;        for(int i = 0; i < m; i++)            dis += Length(t[i],t[(i+1)%m]);        printf("Perimeter length = %.2lf\n\n",dis);    }    return 0;}


原创粉丝点击