POJ 1654 Area

来源:互联网 发布:淘宝卖什么销量最好 编辑:程序博客网 时间:2024/06/03 02:26

        这是一道非常好的计算多边形面积的题目,首先多边形不确定凹凸,其次多边形的点很多,所以这道题就不能用我们平常的想法去根据点计算多边形的面积。通过观察可以发现这道题有一个比较好的地方,那就是多边形的边已经按次序给出,并且保证没有任何相邻的两点和别的边构成相交的情况,而且最终一定会走回原点构成多边形,所以可以根据叉积的性质去求。

        |a×b|=|a|*|b|*sinθ,将叉积除以2正好就是三角形的面积,由于题目中答案一定是0.5的整数倍,所以可以先算两倍的面积最后在进行判断,下面是自己写的代码和注释:

#include<stdio.h>#include<string.h>#define LL long longchar 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;//面积也要用LLint 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);elseprintf("%lld\n",area/2);}return 0;}


原创粉丝点击