您的位置:首页 > 其它

poj 1654 Area 多边形面积

2013-08-02 17:27 357 查看
/*
poj 1654 Area 多边形面积

题目意思很简单,但是1000000的point开不了
*/
#include<stdio.h>
#include<math.h>
#include<string.h>
const int N=1000000+10;
const double eps=1e-8;
struct point
{
double x,y;
point(){}
point(double a,double b):x(a),y(b){}
};
int len,index;
char t_s
;
//基础函数/////////////////////////
double mo_distance(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double mo_xmult(point p2,point p0,point p1)//p1在p2左返回负,在右边返回正
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

bool mo_ee(double x,double y)
{
double ret=x-y;
if(ret<0) ret=-ret;
if(ret<eps) return 1;
return 0;
}
bool mo_gg(double x,double y)  {   return x > y + eps;} // x > y
bool mo_ll(double x,double y)  {   return x < y - eps;} // x < y
bool mo_ge(double x,double y) {   return x > y - eps;} // x >= y
bool mo_le(double x,double y) {   return x < y + eps;}     // x <= y

//求多边形面积
double area_polygon(point shang,point zhe)
{
point yuan;
yuan.x=yuan.y=0;
return mo_xmult(zhe,yuan,shang)/2;
}

///////////////////
int getpoint(point shang,point &zhe)
{
if(t_s[index]=='5')
return 0;;
char doo=t_s[index];
int n=1;
while(t_s[index+1]==t_s[index])
{
++n;
++index;
}
++index;
if(doo=='1')
{
zhe.x=shang.x-n;
zhe.y=shang.y-n;

}else if(doo=='2')
{
zhe.x=shang.x;
zhe.y=shang.y-n;

}else if(doo=='3')
{
zhe.x=shang.x+n;
zhe.y=shang.y-n;

}else if(doo=='4')
{
zhe.x=shang.x-n;
zhe.y=shang.y;

}else if(doo=='9')
{
zhe.x=shang.x+n;
zhe.y=shang.y+n;

}else if(doo=='6')
{
zhe.x=shang.x+n;
zhe.y=shang.y;

}else if(doo=='7')
{
zhe.x=shang.x-n;
zhe.y=shang.y+n;

}else if(doo=='8')
{
zhe.x=shang.x;
zhe.y=shang.y+n;

}
return 1;
}
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--)
{
gets(t_s);
len=strlen(t_s);
index=0;
point shang(0,0),zhe;
double area=0;
while(getpoint(shang,zhe))
{
area+=area_polygon(shang,zhe);
shang=zhe;
}
if(area<0)
area=-area;
__int64 ret=(__int64)area,i;
for(i=ret;i<=ret+2;++i)
{
if(mo_ee((double)i,area))
{
printf("%I64d\n",i);
break;
}else if(mo_ee(0.5+i,area))
{
printf("%I64d.5\n",i);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: