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 == 0) return 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 ==0) break;//不知为什么 写在 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 }
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 == 0) return 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 ==0) break;//不知为什么 写在 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 }