POJ 1654 Area計算ジオメトリ

4551 ワード

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<math.h>

using namespace std;

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};

char s[1000010];

__int64 area,x,y,px,py;

int main()

{

    int sum,t,tmp,i;

    cin>>tmp;

    while(tmp--)

    {

        scanf("%s",s);

        t=strlen(s);

        if(t<3)

        {

            printf("0
"); } else { area=0; x=y=0; for(i=0;i<t-1;i++) { px=x+dx[s[i]-'0']; py=y+dy[s[i]-'0']; area+=(px*y-x*py); x=px; y=py; } area=fabs(area); if(area%2==0) cout<<area/2<<endl; else cout<<area/2<<".5"<<endl; } } return 0; }

ジオメトリを計算し、原点と隣接する2つの点の座標を乗算し、加算/2が面積です.
データの特殊な性質のため、すべての最後の%2は小数点があるかどうかを判断します