/*
两个向量P1和P2的叉积P1^P2的绝对值看作是由点(0,0),p1,p2和p1+p2
四点围成的平行四边形的阴影面积,即原点,P1和P2围成的三角形面积S=|P1^P2|/2;
由此,我们可以利用叉积计算多边形的面积。设多边形的顶点按照顺时针方向排序为P0...p(n-1)。
为使多边形的边首边尾相接,另设Pn=p0.
多边形面积S=(|P(0)^P(1)+...+P(i)^p(i+1)|)/2
*/
/* poj 1654
计算一个特殊对多边形的面积。这个多边形的一个顶点时直角坐标系的原点。
从这个原点出发,可以一步一个顶点的走向多边形的下一个顶点,直到回到初始
顶点。每一步可以向北,西,南,或东走一个单位,或者向西北,东北,西南或
者东南走2的平方根单位长度。
输入:第一行给出一个整数t,表示测试的多边形的个数,接下来的每一行给出一
个字符串,由1到9组的,这里8,2,6和4分别是向北,南,东和西,而9,7,3和1分别
表示向东北,西北,东南和西南。数字5仅出现序列的结束时候。每行多达1000000位
输出:一行给出其面积
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
const double epsi=1e-10;
const int MAXN=100005;
struct Point
{
__int64 x,y;
Point (double _x=0, double _y=0 ) :x(_x),y(_y){}
Point operator + (const Point &op2) const
{
return Point(x+op2.x,y+op2.y);
}
__int64 operator ^(const Point &op2) const
{
return x*op2.y-y*op2.x;
}
};
inline int sign( const double &x)
{
if(x>epsi) return 1;
if(x<epsi) return -1;
return 0;
}
int main()
{
int test=0;
string s;
__int64 ans;
scanf("%d\n",&test);
for(;test;test--)
{
cin>>s;
ans=0;
Point p=Point(0,0),pl;
for(int i=0;i<s.size();i++)
{
if(s[i]=='1') pl=p+Point(-1,-1);
if(s[i]=='2') pl=p+Point(0,-1);
if(s[i]=='3') pl=p+Point(1,-1);
if(s[i]=='4') pl=p+Point(-1,0);
if(s[i]=='5') pl=Point(0,0);
if(s[i]=='6') pl=p+Point(1,0);
if(s[i]=='7') pl=p+Point(-1,1);
if(s[i]=='8') pl=p+Point(0,1);
if(s[i]=='9') pl=p+Point(1,1);
ans+=p^pl;
p=pl;
}
if(ans<0) ans=-ans;
printf("%I64d",ans/2);
if(ans%2) printf(".5");
cout<<endl;
}
return 0;
}
|