POJ 2007 Scrambled Polygon

题目原文

    题目大意是给你一个凸多边形的顶点,然后要你从 (0,0) 开始逆时针输出所有的顶点,就是一个排序,我觉得和凸包没有什么关系,但还是把它归到计算几何之中吧。

方法我还是用的极坐标排序。题目数据也不大,很水的样子,很适合我这个刚开始写计算几何的弱逼。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 60
#define EPS 1e-6
using namespace std;
struct point
{
    int x,y;
    double len,theta;
    int num;
} g[N];
void qsort(int st,int en)
{
    int i=st,j=en;
    g[0]=g[i];
    while(i<j)
    {
        while(i<j && g[0].theta>=g[j].theta) j--;
        if(i<j) { g[i]=g[j]; i++; }
        while(i<j && g[i].theta>=g[0].theta) i++;
        if(i<j) { g[j]=g[i]; j--; }
    }
    g[i]=g[0];
    if(st<i-1) qsort(st,i-1);
    if(i+1<en) qsort(i+1,en);
}
void graham(int *n)
{
    int p=1;
    for(int i=2;i<=*n;i++)
      if( (g[p].y>g[i].y) || (g[p].y==g[i].y && g[p].x>g[i].x)) p=i;
    g[0]=g[p]; g[p]=g[1]; g[1]=g[0];
    for(int i=2;i<=*n;i++)
    {
        g[i].len=sqrt((g[i].x-g[1].x)*(g[i].x-g[1].x)+(g[i].y-g[1].y)*(g[i].y-g[1].y));
        g[i].theta=(g[i].x-g[1].x)/g[i].len;
    }
    qsort(2,*n);
}
int main()
{
    int X,Y,n=0;
    while(scanf("%d%d",&X,&Y)!=EOF)
    {
        n++;
        g[n].x=X; g[n].y=Y;
    }
    graham(&n);
    int k=1;
    while(!(g[k].x==0 && g[k].y==0)) k++;
    g[0]=g[n];
    for(int i=k;i<n+k;i++) printf("(%d,%d)\n",g[i%n].x,g[i%n].y);
    return 0;
}


你可能感兴趣的:(POJ 2007 Scrambled Polygon)