poj 2954 Triangle (pick 定理 的应用 )

题意 :

求一个三角形中的 整数 点有多少个?

题接:

 
多边形的面积 (在网格 图中):

pick 定理  s = b/2  + in  - 1  (b 表示 边上的点   in 表示 内部的点)

 边上的点数 = gcd(|x1 - x2| ,|y1 - y2|);

 

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include< set>
 7 #include<map>
 8 #include<queue>
 9 #include<vector>
10 #include< string>
11  #define Min(a,b) a<b?a:b
12  #define Max(a,b) a>b?a:b
13  #define CL(a,num) memset(a,num,sizeof(a));
14  #define maxn  110
15  #define eps  1e-6
16  #define inf 9999999
17  using  namespace std;
18  struct point
19 {
20      int x;
21      int y;
22 }p[ 4];
23  int det( int x1, int y1, int x2, int y2)
24 {
25      return x1*y2 - x2*y1;
26 }
27  int cross(point a,point b,point c)
28 {
29      return det(b.x - a.x,b.y - a.y,c.x - a.x,c.y - a.y);
30 }
31  int gcd( int a, int b)
32 {
33      if(b ==  0return a;
34 
35      return gcd(b,a%b);
36 }
37  int main()
38 {
39      int x1,x2,x3,y1,y2,y3 ;
40      // freopen("data.in","r",stdin);
41       while(scanf( " %d %d %d %d %d %d ",&x1,&y1,&x2,&y2,&x3,&y3) ==  6)
42     {
43          if(x1== 0&&x2 ==  0&&x3 ==  0&&y1 ==  0&&y2 == 0&&y3 == 0break;//不知为什么 写在 scanf 后 就不对
44         p[ 1].x = x1;
45         p[ 1].y = y1;
46         p[ 2].x = x2;
47         p[ 2].y = y2;
48         p[ 3].x = x3;
49         p[ 3].y = y3;
50 
51          int s = cross(p[ 1],p[ 2],p[ 3]);
52          if(s <  0) s = -s ;
53          int num =  0;
54          int t1 = abs(p[ 1].x - p[ 2].x) ;
55          int t2 = abs(p[ 1].y - p[ 2].y);
56 
57         num +=gcd(t1,t2);
58 
59         t1 = abs(p[ 2].x - p[ 3].x);
60         t2 = abs(p[ 2].y - p[ 3].y);
61         num+=gcd(t1,t2);
62 
63         t1 = abs(p[ 3].x - p[ 1].x);
64         t2 = abs(p[ 3].y - p[ 1].y);
65         num+=gcd(t1,t2);
66          // printf("%lf  %d   ++++\n",s,num);
67          int  ans =  (s +  2 - num)/ 2;
68 
69         printf( " %d\n ",ans);
70 
71 
72 
73 
74     }
75 }

 

 

你可能感兴趣的:(poj)