hdu 3775 pick&多边形面积应用 ~~~~跪在long long上

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=3775

题目意思:

用0-7表示八个坐标方向,输入一串0-7组成的序列,求总的点的个数(包括边界)

题目思想:

pick 定理 :s = n + e/2 -1 

多边形面积:area = cross(   ,  );

如果area不除2,那么area = 2s  = 2n + e -2     ==>   (area + 2) + e = 2(n + e)  ==>  (n+e) = (area + e )/2 +1

如果除以2,那么 area = s  ==>    n = s+1 - e/2;      ==>  n+e  = s+1+e/2;//但是要特断e=1的情况~~~~~!!!

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
   long long x,y;
}P[1000000+6];
char num[1000000+6];
int dir[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1} };
long long xmult(node a,node b)
{
   long long x1 = a.x - P[0].x;
   long long y1 = a.y - P[0].y;
   long long x2 = b.x - P[0].x;
   long long y2 = b.y - P[0].y;
   return x1*y2-x2*y1;
}
long long area(node q[],long long m)
{
    double s=0;
    q[m]=q[0];
    //for(long long i=0;i<m;i++)
    for(int i=1;i<m-1;i++)
    {
        s+=xmult(q[i],q[i+1]);
    }
    return s;
}
int main()
{
    while(~scanf("%s",num))
    {
       long long n,s;
       long long e = strlen(num);
        P[0].x=P[0].y=0;
        for(int i=1;i<e;i++)
        {
            P[i].x=P[i-1].x+dir[num[i-1]-'0'][0];
            P[i].y=P[i-1].y+dir[num[i-1]-'0'][1];
        }
        s = area(P,e)/2;
        if(s<0)s=-s;
        //printf("%I64d\n",(s+e)/2+1);
        n = s+1-e/2;
        if(e==1)printf("1\n");
        else
        printf("%I64d\n",(n+e));
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值