链接:http://poj.org/problem?id=1654

题意:求多边形面积。

思路:题目较为简单,得到多边形的顶点,然后求面积。

#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

const int maxn=1000000+5;
char s[maxn];

struct Point
{
    int x,y;
}p[maxn];

int Cross(Point a,Point b)
{
    return a.x*b.y-b.x*a.y;
}
int main()
{
    int t,len;
    long long area;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        len=strlen(s);
        area=0;
        p[0].x=0;p[0].y=0;
        p[len].x=0;p[len].y=0;
        for(int i=0;i<len;i++)
        {
           switch(s[i])
           {
            case '6': p[i+1].x=p[i].x+1;p[i+1].y=p[i].y;break;
            case '4': p[i+1].x=p[i].x-1;p[i+1].y=p[i].y;break;
            case '2': p[i+1].y=p[i].y-1;p[i+1].x=p[i].x;break;
            case '8': p[i+1].x=p[i].x;p[i+1].y=p[i].y+1;break;
            case '1': p[i+1].x=p[i].x-1;p[i+1].y=p[i].y-1;break;
            case '3': p[i+1].x=p[i].x+1;p[i+1].y=p[i].y-1;break;
            case '9': p[i+1].x=p[i].x+1;p[i+1].y=p[i].y+1;break;
            case '7': p[i+1].x=p[i].x-1;p[i+1].y=p[i].y+1;break;
           }
               area+=Cross(p[i],p[i+1]);
        }
        if(area<0) area=-area;
        if(area%2==0) printf("%I64d\n",area/2);
        else printf("%I64d.5\n",area/2);
    }
    return 0;
}

由于最后结果只可能是整数或者 .5 所以用area用整形处理,另外,在结果中可能会超过int,所以要用long long。

在计算过程中,一开始每次求叉积我都算的是叉积的绝对值,自然wa了,求面积直接累加叉积的值,因为三角形的面积是有向的,最后再取绝对值。

 posted on 2013-05-09 18:49  ∑求和  阅读(152)  评论(0编辑  收藏  举报