UVA 11626

来源:互联网 发布:js写出乘法表 编辑:程序博客网 时间:2024/04/30 07:46

这个就是套凸包的模板的基础题,注意因为三个点可以在凸包的外侧,所以while过程中不要将等于的也弹出

其他就没什么大不了的了

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const double eps=1e-10;int dcmp(double x){    if(fabs(x)<eps) return 0;    return x<0?-1:1;}struct Point{    double x,y;    Point(){}    Point(double x,double y):x(x),y(y){}    bool operator==(const Point& rhs)const    {        return dcmp(x-rhs.x)==0 && dcmp(y-rhs.y)==0;    }    bool operator<(const Point& rhs)const    {        return dcmp(x-rhs.x)<0 || (dcmp(x-rhs.x)==0 && dcmp(y-rhs.y)<0);    }};typedef Point Vector;Vector operator-(Point A,Point 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 ConvexHull(Point *p,int n,Point *ch)//求凸包{    sort(p,p+n);    n=unique(p,p+n)-p;    int m=0;    for(int i=0;i<n;i++)    {        while(m>1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2])<0) m--;        ch[m++]=p[i];    }    int k=m;    for(int i=n-2;i>=0;i--)    {        while(m>k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2])<0) m--;        ch[m++]=p[i];    }    if(n>1) m--;    return m;}const int maxn=100000+10;Point p[maxn],convex[maxn];char str[2];int t,n;int main(){    scanf("%d",&t);    while(t--){        scanf("%d",&n);        for(int i=0;i<n;i++){            scanf("%lf%lf",&p[i].x,&p[i].y);            scanf("%s",str);        }        int ans=ConvexHull(p,n,convex);        printf("%d\n",ans);        for(int i=0;i<ans;i++){            printf("%.0f %.0f\n",convex[i].x,convex[i].y);        }    }    return 0;}

0 0