hdu1392 凸包

凸包这种题要注意细节,比如有没有重点,有没有共线等~~要考虑一下,

#include
#include
#include
#include
#include
using namespace std;
struct node
{
	int x,y;
};
node vex[1000];
bool cmp1(node a,node b)
{
	if(a.y==b.y)
		return a.x0?true:false;
}
node stackk[1000];
int cross(node a,node b,node c)
{
	return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double dis(node a,node b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y));
}
int main()
{
	int t;
	while(scanf("%d",&t),t!=0)
	{
		int i;
		for(i=0;i=1&&cross(stackk[top-1],stackk[top],vex[i])<0)   //对使用极角排序的i>=1有时可以不用,但加上总是好的
				top--;                                           //若使用黑书中第二种排序方法cmp1则必须加上,
			stackk[++top]=vex[i];                                    //控制<0或<=0可以控制重点,共线的,具体视题目而定。
		}


		double s=0;
		for(i=1;i<=top;i++)
			s+=dis(stackk[i-1],stackk[i]);
		s+=dis(stackk[top],vex[0]);
		printf("%.2f\n",s);
		}
	}
}


你可能感兴趣的:(acm计算几何)