POJ2954----pick定理+GCD···

POJ2954----pick定理+GCD···

链接:http://poj.org/problem?id=2954

PICK定理,一个很重要也很方便的定理:

在一个平面直角坐标系内,以整点为顶点的简单多边形(任两边不交叉),它内部整点数为a,它的边上(包括顶点)的整点数为b,则它的面积S = a+b/2-1.

具体证明就不说了,也不难。。

这道题再加上多边形的整点的关系什么的,反正就是用GCD求了。。面积依然直接叉积,不过要注意取绝对值。

 1 //poj-2954
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cmath>
 5 #define eps 1e-8
 6 using namespace std;
 7 
 8 struct point
 9 {
10     int x;int y;
11 };
12 
13 double are(point p1,point p2,point p3)
14 {
15         return ((p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x));
16 }
17 int gcd(int a,int b)
18 {
19     if(b==0) return a;
20     else return gcd(b,a%b);
21 }
22 int abss(int a)
23 {
24     return a>0?a:-a;
25 }
26 
27 int main()
28 {
29     point p1,p2,p3;
30     while(scanf("%d%d%d%d%d%d",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y) == 6
31         && p1.x||p1.y||p2.x||p2.y||p3.x||p3.y)
32     {
33         double area= abss(are(p1,p2,p3))/2.0;
34         double bb=0;              //
35         bb+=gcd(abss(p1.x - p2.x) , abss(p1.y - p2.y));
36         bb+=gcd(abss(p2.x - p3.x) , abss(p2.y - p3.y));
37         bb+=gcd(abss(p1.x - p3.x) , abss(p1.y - p3.y));
38         double b= bb/2.0 - 1.0;
39         int ans=int(area -b);
40         printf("%d\n",ans);
41     }
42     return 0;
43 }

 

posted @ 2012-07-26 01:05  XDruid  阅读(549)  评论(0编辑  收藏  举报