题意:原点开始给你一个路径,路径有可能闭合,有可能不闭合,求其围成的面积。
思路:模拟路径的走法,叉积求有向面积
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
struct Point
{
int x,y;
Point(int x,int y) : x(x),y(y){}
};
int Cross(Point a,Point b)
{
return a.x*b.y - a.y*b.x;
}
Point operator-(Point a,Point b)
{
return Point(a.x-b.x,a.y-b.y);
}
long long abs(long long x)
{
return x > 0 ? x : -x;
}
int dect[10][2] = {{0,0},{-1,-1},{0,-1},{1,-1},{-1,0},{0,0},{1,0},{-1,1},{0,1},{1,1}};
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char ch[1000005];
scanf("%s",ch);
Point a(0,0),b(0,0),c(0,0);
long long ans = 0;
int len = strlen(ch);
for(int i = 0; i < len; i++)
{
if(ch[i] == '5')
break;
else
{
ans += Cross(b-a,c-a);
c = b;
b = Point(b.x+dect[ch[i]-'0'][0],b.y+dect[ch[i]-'0'][1]);
}
}
if(ans % 2 == 0)
printf("%lld\n",abs(ans/2));
else
printf("%lld.5\n",abs(ans/2));
}
return 0;
}