叉乘计算多边形面积:poj 1654 Area

来源:互联网 发布:附近淘宝店 编辑:程序博客网 时间:2024/05/21 00:16

这里写图片描述

这里写图片描述

矢量积a×b的计算结果是垂直于a,b向量的矢量,其大小|a×b|=|a|·|b|·sin(a,b)=x1·y2-x2·y1模值的几何意义是以a,b为边的平行四边形的面积,利用向量的叉乘可以计算多边形的面积。

坐标表达式|a×b|=x1·y2-x2·y1.

题目大意

输入一串数字,不同的数字表示不同的运动方向,计算运动围成的多边形的面积。

解题思路

  • 叉乘计算多边形面积,注意将方向存于方向数组dic[x][y]中,方便直接调用;
  • 假设走1000000步围成正方形其面积6.25×10^10超int,大数用double精确表示会有精度误差,考虑用long long存储,最后判断奇偶性控制输出;
  • point p1记录上一个点的坐标,point p2用于更新下一个点的坐标,更新一个叉乘一下,最后再/2即可

参考代码+部分注释

#include <iostream>#include <cstdio>#include <algorithm>#include <map>#include <vector>#include <queue>#include <cstring>#include <cmath>#include <climits>#define eps 1e-8using namespace std;typedef long long ll;const int INF=INT_MAX;const int maxn = 110;int dic[10][2]={{0,0},{-1,-1},{0,-1},{1,-1},{-1,0},{0,0},{1,0},{-1,1},{0,1},{1,1}};//方向数组,记录每个数字代表的运动方向struct point{    int x,y;};double cross_product(point a,point b){return a.x*b.y-b.x*a.y;}//向量叉乘表示平行四边形面积int main(){ //  freopen("input.txt","r",stdin);   int T;cin>>T;   while(T--){     char ch;     ll ans=0;               //如果是正方形会超int,double会有精度陷阱,故同long long     point p1,p2;p1.x=p1.y=p2.x=p2.y=0;     while(cin>>ch&&ch!='5'){       p2.x+=dic[ch-'0'][0];  //更新p2       p2.y+=dic[ch-'0'][1];       ans+=cross_product(p2,p1);//累加       p1=p2;                //更新p2的同时记录p2     }     ans=ans<0?-ans:ans;     if(ans&1) printf("%lld.5\n",ans/2);//平行四边形面积变三角形面积     else printf("%lld\n",ans/2);   }   return 0;}
0 0