poj1654

题意:从直角坐标系的原点,移动n步,每一步,可以向八个方向移动(九宫格中间向周围的八个方向移动),最终会形成一个规范的多边形(可凸可凹),求多边形面积,

简单利用叉积求多边形面积即可(有向面积的利用),注意要用__int64

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

int dir[10][2] = {{0, 0}, {-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {0, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}};
char str[1000005];

void func(char str[], int& i, __int64& x, __int64& y) {
    while (str[i] != '5' && str[i] == str[i-1]) {
        x += dir[str[i]-'0'][0];
        y += dir[str[i]-'0'][1];
        i++;
    }
}
int main()
{
    int n, i;

    scanf ("%d", &n);
    while (n--) {
       scanf ("%s", str);
       if (str[0] == '5') {
          printf ("0\n"); continue;
       }
       __int64 x1 = dir[str[0]-'0'][0], y1 = dir[str[0]-'0'][1], x2, y2;
       __int64 area = 0;
       i = 1;
       func(str, i, x1, y1);
       for (; str[i] != '5';) {
           x2 = x1 + dir[str[i]-'0'][0];
           y2 = y1 + dir[str[i]-'0'][1];
           i++;
           func(str, i, x2, y2);
           area += x1 * y2 - x2 * y1;
           x1 = x2;
           y1 = y2;
       }
       if (area < 0) area = -area;
       printf ("%I64d", area/2);
       if (area % 2) printf (".5");
       printf ("\n");
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值