您的位置:首页 > 其它

hdu 1392 Surround the Trees

2015-04-01 10:06 375 查看
本题是一个关于几何的题目,题目的意思很简单,就是求最外围的长度,主要是 凸包的模版的运用,借鉴大神们的思路和模版,还有叉积的知识,然后a~~

#include <stdio.h>
#include <math.h>
#include <algorithm>
#define Max 501
#define eps 1e-8
using namespace std;
struct point
{
double x;
double y;
double jiao;
};
point dingdian[Max]; //存储各个顶点的坐标
point points[Max];
int n;
int size;
double sum;

int com1(point a,point b)   //排序yx的点 的坐标
{
if(a.y==b.y)
{
return a.x<b.x;
}
return a.y<b.y;
}
int com2(point a,point b)   //排序角度小到大
{
if(a.jiao==b.jiao)
return a.x<b.x;
return a.jiao<b.jiao;
}
void jijiao()   //求与基点的角度
{
int i;
double x,y;
for(i=1;i<n;i++)
{
x=points[i].x-points[0].x;
y=points[i].y-points[0].y;
points[i].jiao=acos((x/(sqrt(x*x+y*y))));
}
}
bool chaji(point A,point B,point C)   //由判断是否向右拐
{
double x1,x2,y1,y2;
double jieguo;
x1=B.x-A.x;
x2=C.x-A.x;
y1=B.y-A.y;
y2=C.y-A.y;
jieguo=x1*y2-x2*y1;
if(fabs(jieguo)<eps)
jieguo=0;
if(jieguo<=0)
return true;
return false;
}
void zhaodingdian()   //遍历寻找外围的顶点 并存储
{
int top=0,i;
sort(points,points+n,com1);
jijiao();
sort(points+1,points+n,com2);
dingdian[0]=points[0];
size=1;
for(i=1;i<n;i++)
{
while(size>1&&chaji(dingdian[top-1],dingdian[top],points[i]))   //循环取舍点
{
size--;
top--;
}
dingdian[++top]=points[i];
size++;
}

}
double jisuan(point a,point b)  //求距离
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

int main()
{
int i;
while(~scanf("%d",&n)&&n)
{
double sum=0;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&points[i].x,&points[i].y);
}
zhaodingdian();
for(i=0;i<size-1;i++)
{
sum+=jisuan(dingdian[i],dingdian[i+1]);
}
sum+=jisuan(dingdian[0],dingdian[size-1]);
printf("%.2lf\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: