Scrambled Polygon(凸包+極角排序)

題目鏈接:Scrambled Polygon

先給出知識點的講解鏈接:傳送門

極角就是高中學的,極座標系中的極角。
sort對結構體排序,不都有一個cmp的函數嗎?就是這個函數。
我們都會按照一個參數來改,這回我們就按照極角來排序。

bool cmp(node a,node b)
{
    int f=mul(a,b,edge[0]);//以edge[0]點爲三角形的角點,求他們的叉積,下面判斷是順時針方向,還是逆時針方向。
    if(f>0||f==0&&dis(a,edge[0])<dis(b,edge[0])) return 1;
    return 0;
}

思路:直接排序即可。

代碼:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int maxn=1e5+9;
struct node
{
    int x,y;
}edge[maxn];

double dis(node a,node b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
double mul(node a,node b,node c)
{
    return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
bool cmp(node a,node b)
{
    int f=mul(a,b,edge[0]);
    if(f>0||f==0&&dis(a,edge[0])<dis(b,edge[0])) return 1;
    return 0;
}

int main()
{
    int len=0;
    while(~scanf("%d%d",&edge[len].x,&edge[len].y))len++;
    sort(edge,edge+len,cmp);
    for(int i=0;i<len;i++)
        printf("(%d,%d)\n",edge[i].x,edge[i].y);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章