Area(pick定理)
http://poj.org/problem?id=1265
题意:起始为(0,0),给出每个点的偏移量,求依次连接这些点形成的多边形边界上格点的个数。
思路:先将各个点的坐标求出存入,由pick定理知:
面积 = 内部格点数目+边上格点数目/2-1;
每条边边格点数目 = gcd(x2-x1,y2-y1);
内部格点数目 = 面积+1-边界格点数目/2;
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <algorithm> 5 using namespace std; 6 struct node 7 { 8 int x; 9 int y; 10 } point[120]; 11 double area_polygon(int n)//求多边形面积 12 { 13 double s1=0,s2=0; 14 int i; 15 for (i=1; i<=n; i++) 16 { 17 s1+=point[i%n].y*point[i-1].x; 18 s2+=point[i%n].y*point[(i+1)%n].x; 19 } 20 return fabs(s1-s2)/2; 21 } 22 int main() 23 { 24 int t,o = 0; 25 scanf("%d",&t); 26 while(t--) 27 { 28 ++o; 29 int n,dx,dy,cnt = 0; 30 point[0].x = 0; 31 point[0].y = 0; 32 scanf("%d",&n); 33 for (int i = 1; i <= n; i++) 34 { 35 scanf("%d %d",&dx,&dy); 36 point[i].x = point[i-1].x+dx;//存入各点坐标(前一个坐标加偏移量) 37 point[i].y = point[i-1].y+dy; 38 cnt += __gcd(abs(point[i].x-point[i-1].x),abs(point[i].y-point[i-1].y)); 39 //cnt代表边上的点 40 } 41 double A = area_polygon(n); 42 int inpoint = A+1-cnt/2;//pick定理(面积 = 内部格点数目+边上格点数目-1) 43 printf("Scenario #%d:\n",o); 44 printf("%d %d %.1f\n\n",inpoint,cnt,A); 45 } 46 return 0; 47 }