POJ 2007 Scrambled Polygon 凸包加排序 水题一道

本文介绍了一种使用C++实现的凸包顶点逆时针输出算法,通过Andrew法寻找凸包并按照逆时针顺序输出顶点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给出凸包的个个顶点   从(0,0)点开始逆时针输出凸包顶点 

分析 :凸包顶点都给你了  计算一遍存下来  然后找到(0,0)点   按照逆时针顺序 对应数组中的点  输出就是了    

下面看代码

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

struct Point
{
    int x,y;
}s[55],str[55];

typedef struct Point point;

int cmp(point a,point b)//排序参数x从小到大排 x相同y从小到大排
{
    if(a.x<b.x)return 1;
    if(a.x==b.x&&a.y>b.y)return 1;
    return 0;
}

//极角比较, 返回-1: p0p1在p0p2的右侧,返回0:p0,p1,p2共线
int Cross(struct Point p1, struct Point p2, struct Point pb)
{
    int delta=(p1.x-pb.x)*(p2.y-pb.y)-(p2.x-pb.x)*(p1.y-pb.y);
    if (delta<0) return 1;
    else if (delta==0) return 0;
    else return -1;
}

int ConvexHull(point *p,int n,point *ch)//Andrew法寻找凸包  必须先排序
{
    int m = 0;
    for(int i = 0; i < n; i++)//寻找下凸包
    {
        while(m > 1 && Cross(ch[m-1],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],p[i],ch[m-2]) <= 0 )m--;
        ch[m++] = p[i];
    }
    if(n > 1)m--;
    return m;
}

int main()
{
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    #endif // LOCAL
    int T;
    for(T = 0; scanf("%d%d",&s[T].x,&s[T].y)!=EOF; T++);
    sort(s,s+T,cmp);
    int m = ConvexHull(s,T,str);
    int k;
    for(k = 0; k <= m; k++)
        if(str[k].x == 0)break;
    for(int j = k; j > 0; j--)
        printf("(%d,%d)\n",str[j].x,str[j].y);
    for(int j = m; j > k; j--)
        printf("(%d,%d)\n",str[j].x,str[j].y);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值