POJ 1654 Area

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

        |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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值