題意:從原點出發,沿著8個方向走,每次走1個點格或者根號2個點格的距離,最終回到原點,求圍住的多邊形面積。
分析:直接記錄所經過的點,然后計算多邊形面積。注意,不用先保存所有的點,然后計算面積,邊走變算,不然會超內存。最多有1000000個點。
注意:精度問題,使用long long /__int64,直接使用double不準確。方向的處理使用數組。
// Time 94ms; Memory 1036K
#include<iostream>
#include<cstring>
#define maxn 1000010using namespace std;char s[maxn];
long long dx[]={-1,0,1,-1,0,1,-1,0,1},dy[]={-1,-1,-1,0,0,0,1,1,1};struct point
{long long x,y;point(long long xx=0,long long yy=0):x(xx),y(yy){}
}a,b;long long cross()
{return a.x*b.y-a.y*b.x;
}
int main()
{int i,t,l;long long are;cin>>t;while(t--){cin>>s;l=strlen(s);if(l<2){cout<<"0"<<endl;continue;}a=point(dx[s[0]-49],dy[s[0]-49]);b=point(a.x+dx[s[1]-49],a.y+dy[s[1]-49]);are=cross();for(i=2;s[i];i++){a=b;b=point(a.x+dx[s[i]-49],a.y+dy[s[i]-49]);are+=cross();}if(are<0) are=-are;cout<<are/2;if(are%2) cout<<".5";cout<<endl;}return 0;
}