#include<stdio.h>
#include<math.h>
typedef struct
{
int x,y;
}point;
double area(point a,point b,point c)
{
return fabs(1.0*(c.x-a.x)*(b.y-a.y)-1.0*(c.y-a.y)*(b.x-a.x));
}
int cross(point op, point sp, point ep)
{
int t;
t=(sp.x-op.x) * (ep.y-op.y) - (ep.x-op.x) * (sp.y-op.y);
if(t>0)
return 1;
else if(t<0)
return -1;
else
return 0;
}
int cmp(point a,point b)
{
if(a.y>b.y)
return 1;
if(a.y==b.y)
{
if(a.x>b.x)
return 1;
}
return 0;
}
void quick_sort (point *p,int low,int high)
{
if(low>=high)
return;
int i,j;
point temp;
i=low;
j=high;
temp=p[i];
while(i<j)
{
while(i<j && cmp(p[j],temp)) //p[j]>temp
j--;
if(i<j)
p[i++]=p[j];
while(i<j && cmp(temp,p[i])) //p[i]<temp
i++;
if(i<j)
p[j--]=p[i];
}
p[i]=temp;
quick_sort(p,low,i-1);
quick_sort(p,i+1,high);
}
int graham(point pnt[], int n, point res[])
{
int i, len, k = 0, top = 1,ans;
double sum;
quick_sort(pnt,0,n-1);
if(n==0)
return 0;
res[0]=pnt[0];
if(n==1)
return 1;
res[1]=pnt[1];
if(n==2)
return 2;
res[2]=pnt[2];
for (i=2;i<n;i++) {
while (top && cross(pnt[i],res[top],res[top-1])>=0)
top--;
res[++top]=pnt[i];
}
len=top;
res[++top]=pnt[n-2];
for(i=n-3;i>=0;i--)
{
while(top!=len && cross(pnt[i],res[top],res[top-1])>=0)
top--;
res[++top]=pnt[i];
}
sum=0;
for(i=2;i<top;i++)
sum+=area(res[i],res[i-1],res[0]);
ans=sum/100;
printf("%d\n",ans);
return top;
}
int main()
{
point pnt[10000],res[10000];
int i,n;
while(scanf("%d",&n)!=EOF)
{
if(n<3)
{
printf("0\n");
continue;
}
for(i=0;i<n;i++)
scanf("%d%d",&pnt[i].x,&pnt[i].y);
graham(pnt,n,res);
}
return 0;
}
poj 3348(凸包模版体)
最新推荐文章于 2022-02-25 19:38:17 发布
本文详细介绍了如何使用Graham扫描算法计算给定点集的凸包,并提供了C语言实现代码。通过快速排序对点进行排序,然后逐个检查每个点是否位于凸包上,最终得到凸包的顶点集合。
366

被折叠的 条评论
为什么被折叠?



