题意:从原点出发,沿着8个方向走,每次走1个点格或者根号2个点格的距离,最终回到原点,求围住的多边形面积。
分析:直接记录所经过的点,然后计算多边形面积。注意,不用先保存所有的点,然后计算面积,边走变算,不然会超内存。最多有1000000个点。
注意:精度问题,使用long long /__int64,直接使用double不准确。方向的处理使用数组。
// Time 94ms; Memory 1036K #include<iostream> #include<cstring> #define maxn 1000010 using 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; }