这道题用到了一个我不知道的定理,Pick定理。意思是格子面上的多边形的边的点的个数on和内部点的个数in的关系式Area = on / 2 + in - 1;
求Area可以用叉乘法。注意最后那个Area/=2.0。
Code:

/**//*TOJ 1011 Area
pick theory */
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int px[100],py[100];

int gcd(int a,int b)
{
int temp;

while(b!=0)
{
temp=b;
b=a%b;
a=temp;
}
return a;
}
int main(void)


{
int cas,dx,dy,on,in,i,j,n;
double area;
scanf("%d",&cas);

for(j=1;j<=cas;j++)
{
scanf("%d",&n);
px[0]=py[0]=dx=dy=area=on=0;

for(i=1;i<=n;i++)
{
scanf("%d%d",&dx,&dy);
on+=gcd(abs(dx),abs(dy));
px[i]=px[i-1]+dx;
py[i]=py[i-1]+dy;
area+=(px[i-1]*py[i]-px[i]*py[i-1]);
}
area=area/2.0;
in=area+1-on/2;
printf("Scenario #%d:\n%d %d %.1lf\n\n",j,in,on,area);
}
}

