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 }