UVA, 681Convex Hull Finding(凸包)

来源:互联网 发布:atmlh642数据 编辑:程序博客网 时间:2024/05/21 13:03

题意:求凸包上的点。从那个最下面的点逆时针输出。

分析:采用凸包解决,用Graham扫描算法,就出来了



#include <iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;#define N 666#define EPS 1e-3struct point{    double x,y;    point(double x,double y):x(x),y(y){}    point(){}    bool operator< (const point &s)const    {        return x<s.x||(x==s.x&&y<s.y);    }    double det(point a)    {        return x*a.y-y*a.x;    }    point operator-(point a)    {        return point(x-a.x,y-a.y);    }    point operator +(point a)    {        return point(x+a.x,y+a.y);    }    point operator *(double s)    {        return point(x*s,y*s);    }     point operator /(double s)    {        return point(x/s,y/s);    }};point p[N],res[N];int n,k;int main(){    int tt;    scanf("%d",&tt);    printf("%d\n",tt);    while(tt--)    {        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%lf%lf",&p[i].x,&p[i].y);        }        sort(p,p+n-1);         k=0;        for(int i=0;i<n-1;i++)        {            while(k>1&&(res[k-1]-res[k-2]).det(p[i]-res[k-2])<EPS)            k--;            res[k++]=p[i];        }          int t=k;         for(int i=n-3;i>=0;i--)          {            while(k>t&&(res[k-1]-res[k-2]).det(p[i]-res[k-2])<EPS)            k--;            res[k++]=p[i];          }          printf("%d\n",k);         int mi=0;       for(int i=1;i<k-1;i++)       {           if(res[mi].y>res[i].y)               mi=i;       }       for(int i=mi;i<k;i++)       {           printf("%.0f %.0f\n",res[i].x,res[i].y);       }       for(int i=1;i<=mi;i++)       {           printf("%.0f %.0f\n",res[i].x,res[i].y);       }       if(tt){            int a;        scanf("%d",&a);        printf("-1\n");       }    }    return 0;}


0 0
原创粉丝点击