题目:
题意:
1左下 2下 3右下 4左 5回到原点 6右 7左上 8上 9右上
起点在原点,按照操作进行,走出来一个多边形,求多边形的面积。
题解:
这个就是裸题呀,然后我写了一发。。GG没看空间限制M了
求面积
for (int i=2;i<n;i++) area+=cj(dian[i]-dian[1],dian[i%n+1]-dian[1]);
area/=2; area=abs(area);
而且因为叉积本身有正负,所以每次去做不用求abs,但是因为面积需要是个正数,所以最后要取abs
对于这道题来说对longlong取绝对值必须手写= =
代码:
#include <cstdio>
#define LL long long
using namespace std;
int c[10][2]={{0,0},{-1,-1},{0,-1},{1,-1},{-1,0},{0,0},{1,0},{-1,1},{0,1},{1,1}};
struct po
{
LL x,y;
po(LL X=0,LL Y=0){x=X;y=Y;}
};char fx[1000005];
po operator -(po x,po y){return po(x.x-y.x,x.y-y.y);}
LL abs(LL x){return (x>0)?x:-x;}
LL cj(po x,po y){return x.x*y.y-x.y*y.x;}
int main()
{
int T;scanf("%d",&T);
while (T--)
{
LL x=0,y=0;int n=0;
po p=po(x,y);
scanf("%s",fx);int i=0;
po a,b;LL area=0;
while (fx[i]-'0'!=5)
{
x+=c[fx[i]-'0'][0]; y+=c[fx[i]-'0'][1];
a=po(x,y);
if (i) area+=cj(b-p,a-p);
i++;b=a;
}
area=abs(area);
printf("%lld",area/2);
if (area&1) printf(".5");
printf("\n");
}
}