题目连接:
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;
}