链接:http://poj.org/problem?id=1265
pick定理,如果一个多边形的每个顶点都在一个坐标系的整数点上,即格子点上,那么其内部包含的点in和边上的点on以及多边形的面积的关系是s=in+on/2-1;还要用到多边形的面积为从原点到两个相邻顶点的向量的叉积的和。以及两个格子点之间的连线上格子点的数目为gcd(abs(x1-x2),abs(y1-y2));
View Code
1 #include<stdio.h> 2 #define M 105 3 int x[M],y[M]; 4 int gcd(int a,int b) 5 { 6 if(!a) 7 return b; 8 int c; 9 while(b) 10 { 11 c=b; 12 b=a%b; 13 a=c; 14 } 15 return a; 16 } 17 int abs(int a) 18 { 19 return a>0?a:-a; 20 } 21 int main() 22 { 23 int area,i,j,k,t,n,e,tx,ty,in; 24 scanf("%d",&t); 25 x[0]=y[0]=0; 26 int icase=1; 27 while(t--) 28 { 29 scanf("%d",&n); 30 area=e=0; 31 for(i=1;i<=n;i++) 32 { 33 scanf("%d%d",&tx,&ty); 34 x[i]=x[i-1]+tx; 35 y[i]=y[i-1]+ty; 36 e+=gcd(abs(tx),abs(ty)); 37 area+=x[i-1]*y[i]-x[i]*y[i-1]; 38 } 39 in=(area-e+2)/2; 40 printf("Scenario #%d:\n",icase++); 41 printf("%d %d %.1lf\n\n",in,e,area/2.0); 42 } 43 return 0; 44 }