您的位置:首页 > 其它

hdu1392——Surround the Trees

2010-09-17 19:07 309 查看
这道题用qsort爽了一把,对qsort有了初步的认识!

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define max 3300
struct node
{
double x,y;
}g[max],stack[max],min;
int n;
void swap(int a,int b)
{
min=g[a];g[a]=g[b];g[b]=min;
}
double ans(node yuan,node zhong,node last)
{
return (yuan.x-zhong.x)*(last.y-zhong.y)-(last.x-zhong.x)*(yuan.y-zhong.y);
}
double dis(node a,node b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int cmp(const void *a,const void *b)//逆时针排序 返回正数要交换
{
node *a1=(node*)a;
node *b1=(node*)b;
if((ans(g[0],*a1,*b1)>0)||(ans(g[0],*a1,*b1)==0&&dis(g[0],*a1)<=dis(g[0],*b1)))
return 1;
else
return -1;
}
void Graham()
{
int i,k;
min=g[0];k=0;
for(i=1;i<n;i++)
if(g[i].y<min.y||(g[i].y==min.y&&g[i].x<min.x))
{
min=g[i];
k=i;
}
swap(0,k);
qsort(g+1,n-1,sizeof(g[0]),cmp);
stack[0]=g[0];
stack[1]=g[1];
stack[2]=g[2];
int top=2;
g
=g[0];
for(i=3;i<=n;i++)
{
while(ans(stack[top-1],stack[top],g[i])>0)
top--;
stack[++top]=g[i];
}
double sum=0.0;
for(i=0;i<top;i++)
sum+=sqrt(dis(stack[i],stack[i+1]));
printf("%.2lf/n",sum);
}
main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
for(i=0;i<n;i++)//n=1||n=2需要考虑下,以后凸包问题,要注意下这个
scanf("%lf%lf",&g[i].x,&g[i].y);
if(n==1)
printf("0.00/n");
else if(n==2)
printf("%.2lf/n",sqrt(dis(g[0],g[1])));
else
Graham();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: