POJ 1654 Area(计算几何)

Description
一个坐标系,从原点开始走,然后1-4分别代表,向右下走,向右走,向右上走,向下走,5代表回到原点,6-9代表,向上走,向左下走,向左走,向左上走。给出一串包含1-9的字符串,问你这些点所围成的面积
Input
第一行为用例组数t,之后t行每行一个由1~9组成的字符串
Output
输出这些点所围成的面积
Sample Input
4
5
825
6725
6244865
Sample Output
0
0
0.5
2
Solution
向量叉乘求面积
Code

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
int dx[]={0,1,1,1,0,0,0,-1,-1,-1};   
int dy[]={0,-1,0,1,-1,0,1,-1,0,1}; 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        char s[1111111];
        scanf("%s",s);
        int len=strlen(s);
        if(len<3)
        {
            printf("0\n"); 
            continue;
        }
        ll area=0,x=0,y=0,px,py;
        for(int i=0;i<len;i++)
        {
            px=x+dx[s[i]-'0'];
            py=y+dy[s[i]-'0'];
            area+=(px*y-py*x);
            x=px;
            y=py;
        }
        if(area<0)area=-area;
        if(area%2==0)
            printf("%lld\n",area/2);
        else
            printf("%lld.5\n",area/2);
    }
    return 0;
}

你可能感兴趣的:(POJ 1654 Area(计算几何))