这是一道非常好的计算多边形面积的题目,首先多边形不确定凹凸,其次多边形的点很多,所以这道题就不能用我们平常的想法去根据点计算多边形的面积。通过观察可以发现这道题有一个比较好的地方,那就是多边形的边已经按次序给出,并且保证没有任何相邻的两点和别的边构成相交的情况,而且最终一定会走回原点构成多边形,所以可以根据叉积的性质去求。
|a×b|=|a|*|b|*sinθ,将叉积除以2正好就是三角形的面积,由于题目中答案一定是0.5的整数倍,所以可以先算两倍的面积最后在进行判断,下面是自己写的代码和注释:
#include<stdio.h>
#include<string.h>
#define LL long long
char step[1000005];
struct Point{//点的定义一定要用long long,我在上面WA过一次
LL x,y;
};
int dir_x[10]={0,-1,0,1,-1,0,1,-1,0,1};//x方向
int dir_y[10]={0,-1,-1,-1,0,0,0,1,1,1};//y方向
int mult(Point a,Point b)//a与b的叉积
{
return (a.x*b.y-a.y*b.x);
}
int main()
{
LL area;//面积也要用LL
int t,i;
scanf("%d",&t);
while(t--)
{
area=0;
Point start,end;
start.x=start.y=0;
scanf("%s",step);
for(i=0;i<strlen(step);i++)
{
end.x=start.x+dir_x[step[i]-'0'],end.y=start.y+dir_y[step[i]-'0'];
area+=mult(end,start);
start=end;
}
if(area<0)
area=-area;
if(area%2)
printf("%lld.5\n",area/2);
else
printf("%lld\n",area/2);
}
return 0;
}