POJ 1654

来源:互联网 发布:nginx 静态服务器缓存 编辑:程序博客网 时间:2024/05/17 01:11

这题目一开始就没有看懂,后来比赛结束后,看别人的报告,才知道什么意思,

:在一个矩阵上面,一开始位于原点,现在你可以往8个方向走,每次走1个单位(上下左右)或者根号2个单位(其他四个方向)。现在给你每次走的方向,(保证最后回到原点)。问你做过的边多围成的多边形的面积是多少。1:西南 2:南 3:东南 4:西 5: 不走 6: 东 7:西北 8:北 9:东北 

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int maxn=1000005;
char c[maxn];


struct node
{
    double x;
    double y;
};


double area(node p0,node p1,node p2)//三角形面积,利用叉乘来算
{
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}




int main()
{
    int t,k;
    long long  ans;//必须用 long long 
    node p0,p1,p2;
    scanf("%d",&t);
        while(t--)
        {
            p0.x=0;
            p0.y=0;
            p1=p0;
            p2=p0;
            ans=0;
            memset(c,0,sizeof(c));
            scanf("%s",c);
            int len=strlen(c);
            for(int i=0; i<len; i++)
            {
                k=c[i]-'0';
                switch(k)
                {
                case 1:
                    p2.x=p1.x-1;
                    p2.y=p1.y-1;
                    break;
                case 2:
                    p2.x=p1.x;
                    p2.y=p1.y-1;
                    break;
                case 3:
                    p2.x=p1.x+1;
                    p2.y=p1.y-1;
                    break;
                case 4:
                    p2.x=p1.x-1;
                    p2.y=p1.y;
                    break;
                case 5:
                    p2.x=p1.x;
                    p2.y=p1.y;
                    break;
                case 6:
                    p2.x=p1.x+1;
                    p2.y=p1.y;
                    break;
                case 7:
                    p2.x=p1.x-1;
                    p2.y=p1.y+1;
                    break;
                case 8:
                    p2.x=p1.x;
                    p2.y=p1.y+1;
                    break;
                case 9:
                    p2.x=p1.x+1;
                    p2.y=p1.y+1;
                    break;
                }
                ans+=area(p0,p1,p2);
                p1=p2;
            }
            if(ans<0)
                ans=0-ans;
            if(ans&1)
            {
                cout<<ans/2<<".5"<<endl;
            }
            else
            {
                cout<<ans/2<<endl;
            }
        }
    return 0;
}