http://poj.org/problem?id=1265
求 多边形内部整点的个数 边上整点数 多边形的面积
公式: S = I + E/2 - 1;
S 表示多边形面积 I 表示边上整点的个数 E表示多边形内部整点的个数
某条边的整点个数 gcd( abs(x2-x1), abs(y2-y1) ) +1
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string.h>
#define M 200
struct point
{
int x,y;
}po[M];
int gcd(int a,int b)
{
int i;
if(a==0) return b;
if(b==0) return a;
i=a<b?a:b;
for(;i>=1;i--)
if(a%i==0&&b%i==0)
return i;
}
int GetE(point a,point b)
{
return gcd(abs(a.x-b.x),abs(a.y-b.y));
}
double GetArea(int n)
{
int i,a,b,x,y;
double s;
s=0;
for(i=0;i<n;i++)
{
a=po[(i+1)%n].x;
b=po[(i+1)%n].y;
s+=(po[i].y*a-po[i].x*b)*1.0/2;
}
return fabs(s);
}
int main()
{
int cas,n,k=1,i;
int I,E;
double S;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
int a=0,b=0;
int c,d;
for(i=0;i<n;i++)
{
scanf("%d%d",&c,&d);
a+=c;b+=d;
po[i].x=a;
po[i].y=b;
}
E=0;
for(i=0;i<n;i++)
E+=GetE(po[i],po[(i+1)%n]);
S=GetArea(n);
I=(int)S+1-E/2;
printf("Scenario #%d:\n",k++);
printf("%d %d %.1lf\n\n",I,E,S);
}
return 0;
}