【POJ 1654】 【叉积】Area
题目
解题思路
先处理出所有点
每一个多边形都可以被分割成很多个三角形
所以选定一个点,用叉积求出面积再除2的绝对值即为答案(叉积求的是平行四边形面积所以要除2)
P.S 面积除2可能出现小数,但叉积必须要用long long不然会爆,所以特殊处理
代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct lzf{
int x,y;
}a[1000010];
string s;
long long ans,c,x,y,n,len;
int fx[10]={0,1,1,1,0,0,0,-1,-1,-1},fy[10]={0,-1,0,1,-1,0,1,-1,0,1};
long long cj(int k,int i,int j)
{
return 1ll*(a[i].x-a[k].x)*(a[j].y-a[k].y)-1ll*(a[j].x-a[k].x)*(a[i].y-a[k].y);
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
cin>>s;
x=y=ans=0;
len=s.size();
for (int j=2;j<=len;j++)
{
c=s[j-2]-48;
x+=fx[c],y+=fy[c];
a[j]=(lzf){x,y};
}
a[1]=(lzf){0,0};
for (int j=2;j<=len;j++)
ans+=cj(1,j,j+1);
if (ans<0) ans=-ans;
if (ans%2==0) printf("%lld\n",ans/2);
else printf("%lld.5\n",ans/2);
}
return 0;
}