pku 1654 Area 叉积求多边形面积

http://poj.org/problem?id=1654Area

给定起点(0,0)然后给出1 - 4 | 6 - 9 表示走的方向,输入数据保证能够回到原点。很裸的叉积求多边形面积。这里精度控制很坑爹,只要出现小数就取整数+0.5,double不能控制,所以用long long或者__int64来控制。

#include <cstdio>

#include <cstring>

#include <iostream>

#define maxn 1000010



struct point

{

    int x,y;

}p[maxn];



char str[maxn];

int dir[10][2] = {{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}};



double det(double x1,double y1,double x2,double y2)

{

    return x1*y2 - x2*y1;

}

int main()

{

    int t,i;

    __int64 ans;

   scanf("%d",&t);

    while (t--)

    {

        i = 1;

        double tx = 0,ty = 0;

        ans = 0;

        scanf("%s",str);

        int len = strlen(str) - 1;

        for (i = 0; i < len; ++i)

        {

            //printf("%c",str[i]);

            int pos = str[i] - '0';

            //注意我们初始化的方向是0-8,在这里调整

            if (pos > 5) pos -= 2;

            else pos--;

            double xx = tx + dir[pos][0];

            double yy = ty + dir[pos][1];

            //printf("%lf %lf %lf %lf\n",tx,ty,xx,yy);

            ans += (__int64)det(xx,yy,tx,ty);

            tx = xx; ty = yy;

        }

        if (ans < 0) ans = -ans;

        if (ans%2 != 0)

        printf("%I64d.5\n",ans/2);

        else

        printf("%I64d\n",ans/2);

    }

    return 0;

}

  

 

你可能感兴趣的:(pku)