题目大意:一个坐标系,从原点开始走,然后1-4分别代表,向右下走,向右走,向右上走,向下走,5代表回到原点,6-9代表,向上走,向左下走,向左走,向左上走。(看翻译直接无限WA),给出一串包含1-9的字符串,问你这些点所围成的面积。
根据向量叉乘即为其组成平行四边形的面积,除以二变(取绝对值)为三角形的面积
向量叉乘便可以很容易地求多边形面积。
向量的一边为(a,b),另一边为(c,d)
s=abs(a*d-b*c)/2;
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
int movex[10]={0,1,1,1,0,0,0,-1,-1,-1};
int movey[10]={0,-1,0,1,-1,0,1,-1,0,1};
int main()
{
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
if(s.size()<3)
{
cout<<0<<endl;
continue;
}
long long area=0;
int x=0,y=0,nx=0,ny=0;
for(int i=0;i<s.size();++i)
{
nx=x+movex[s[i]-'0'];
ny=y+movey[s[i]-'0'];
area+=nx*y-x*ny;
x=nx;
y=ny;
}
if(area<0)
area=-area;
if(area&1)
{
cout<<area/2<<".5"<<endl;
}
else
{
cout<<area/2<<endl;
}
}
}