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 }
View Code

 

 

 

posted @ 2013-10-15 21:16  N_ll  阅读(189)  评论(0编辑  收藏  举报