題目:從一個點出發,8個方向,給出每一步的方向,求出走過的路徑形成的多邊形的面積。不過題目說了會首尾 其實利用向量叉積求解多邊形面積,也不只是適用於凸邊形。出現凹的部分,剛好一正一負,抵消了。
不過這題討厭的是精度。
double是不能過的,必須要用整數,又不能溢出,用64位整數,輸出的時候面積只需要除以2,所以只需要判斷奇偶。。。。。啊啊啊WA好多次不只因為精度,八個方向對應的坐標變化錯了好幾次,東西不分啊
[cpp]
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<string>
#include<algorithm>
#include<queue>
#define LL __int64
#define eps 1e-7
#define N 2000000
#define MOD 1000000007
#define inf 1<<30
#define zero(a) (fabs((double)(a))<eps)
using namespace std;
struct Point{
int x,y;
}p[1000005];
int n;
int way[9][2]={1,-1,1,0,1,1,0,-1,0,0,0,1,-1,-1,-1,0,-1,1};
LL xmul(Point p0,Point p1,Point p2){
return (LL)(p1.x-p0.x)*(p2.y-p0.y)-(LL)(p2.x-p0.x)*(p1.y-p0.y);
}
LL area(){
LL ans=0;
for(int i=1;i<=n;i++)
ans+=xmul(p[0],p[i],p[i+1]);
return ans<0?-ans:ans;
}
char str[1000005];
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",str);
p[0].x=0;p[0].y=0;
for(n=0;str[n+1];n++){
int dir=str[n]-'1';
p[n+1].x=p[n].x+way[dir][0];
p[n+1].y=p[n].y+way[dir][1];
}
LL ans=area();
if(ans%2==0) printf("%I64d\n",ans/2);
else printf("%I64d.5\n",ans/2);
}
return 0;
}