nyoj 78(凸包基础)

本文介绍了NOIP比赛中的第78题,重点讲解了解决问题时的凸包算法。首先,要找到具有最小y坐标的点A,然后以A为基准进行逆时针方向的排序。最后,通过叉积遍历来进一步处理这些点,从而求得凸包。
摘要由CSDN通过智能技术生成

原题:

http://acm.nyist.net/JudgeOnline/problem.php?pid=78

3步求凸包:

     1,找到 y 坐标 最小的点------A

     2,以A为基准点逆时针排序(叉积)

     3,开始遍历(叉积)

# include <iostream> 
# include <stack> 
# include <string> 
#include <math.h> 
#include<algorithm> 
#include<queue> 
using namespace std; 
   
typedef struct Point{ 
    int x, y; 
    bool operator < (const Point& other) const{ 
        if (x != other.x)  
            return x < other.x; 
        return y < other.y; 
    } 
}Point; 
Point p[105]; 
int Cross(Point a,Point b,Point c){ 
    return (b.x - a.x)*(c.y - a.y) - (c.x - a.x)*(b.y - a.y); 
} 
bool cmp(Point a,Point b){ 
    return Cross(p[0], a, b)>0; 
} 
int main(){ 
    int N; 
    int m, i, j; 
    scanf("%d", &N); 
    while (N--){ 
        scanf("%d", &m); 
        for (i = 0; i < m; i++) 
            scanf("%d%d",&p[i].x,&p[i].y); 
        sort(p, p + m); //1,找到 y 坐标 最小的点------A
        sort(p, p + m, cmp); //2,以A为基准点逆时针排序(叉积)
        Point ans[105]; 
        ans[0] = p[0]; 
        ans[1] = p[1]; 
       //3,开始遍历(叉积)       
        for (j = i = 2; i < m; i++){ 
            while (j>1&&Cross(ans[j - 1], ans[j - 2], p[i])>0) 
                    j--; 
            ans[j++] = p[i]; 
        } 
        sort(ans, ans + j); 
        for (i = 0; i < j; i++) printf("%d %d\n", ans[i].x, ans[i].y); 
    } 
    return 0; 
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值