Area(poj 1654)

题目大意:一个坐标系,从原点开始走,然后1-4分别代表,向右下走,向右走,向右上走,向下走,5代表回到原点,6-9代表,向上走,向左下走,向左走,向左上走。给出一串包含1-9的字符串,问你这些点所围成的面积。

/*
  根据面积公式,Area=1/2*abs((x0*y1-x1*y0)+(x1*y2-x2*y1)...+(xn*yn-1-xn-1*yn)+(xn*y0-x0*yn)) ,
  把相邻两点和原点组成一个三角形,而总面积是这n个三角形面积的和,而三角形面积是两个相邻边向量的叉积。 
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 1000010
#define lon long long
using namespace std;
char ch[N];
int dx[10]={0,1,1,1,0,0,0,-1,-1,-1};
int dy[10]={0,-1,0,1,-1,0,1,-1,0,1};
int main(){
    int T;scanf("%d",&T);
    while(T--){
        int x=0,y=0,len;lon area=0;
        scanf("%s",ch);
        len=strlen(ch);
        if(ch[len-1]!='5'||len<2){
            printf("0
");continue;
        }
        for(int i=0;i<len;i++){
            int px=x+dx[ch[i]-'0'];
            int py=y+dy[ch[i]-'0'];
            area+=(lon)x*(lon)py-(lon)px*(lon)y;
            x=px;y=py;
        }
        if(area<0)area=-area;
        cout<<area/2;
        if(area%2) printf(".5");
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/harden/p/6284222.html