凸包
今天看了一下凸包,自己理解的也不是很深,在这里说说自己的理解
如何求这个凸包呢
排序后应该是这样
第一步 0 , 1 ,2入栈 第二步 1到3左转,2出栈
第三步 1到4右转,4入栈 最后遍历完成,凸包形成
下面是代码
struct node
{
long long x,y;
}q[51234],stack1[51234];
int n,top;
long long dist(node p1,node p2) //两点距离的平方
{
return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
}
long long mult(node p1,node p2,node p0) //判断是否左转
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int cmp(node p1,node p2) //极角排序的比较函数
{
if(mult(p1,p2,q[0])>0)
return 1;
else if(mult(p1,p2,q[0])==0 && dist(p1,q[0])<dist(p2,q[0])) //相等的按距离近的
return 1;
return 0;
}
void Gramham()
{
int i,k=0;
for(i=0;i<n;i++)
{
if(q[i].y<q[k].y || (q[i].y==q[k].y && q[i].x<q[k].x)) //找y最小的点,y相等找x最小的点
k=i;
}
node tep;
tep=q[0];
q[0]=q[k];
q[k]=tep;
sort(q+1,q+n,cmp);
stack1[0]=q[0];
stack1[1]=q[1];
stack1[2]=q[2];
top=2;
for(i=3;i<n;i++)
{
while(top>1 && mult(q[i],stack1[top],stack1[top-1])>=0) //是否左转,是继续判断,不是,就入栈
top--;
stack1[++top]=q[i];
}
}
1万+



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



