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 }

 

 

posted @ 2012-08-25 21:20  Szz  阅读(254)  评论(0编辑  收藏  举报