poj 2954 Triangle Pick公式


http://poj.org/problem?id=2954
计算三角内部座标值为整数的点有多少个(不包括边上和顶点的点)。
Pick公式的应用:Area=a/2+b-1;a为边界点,b为内部点。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<cstdio>
 4 #include<vector>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
 8 struct point
 9 {
10     int x,y;
11 }p[4];
12 struct line
13 {
14     int a,b,c;
15 }q[4];
16 int num,ans;
17 void lines(point p1,point p2)
18 {
19     int a,b,c;
20     a=p2.y-p1.y;
21     b=p1.x-p2.x;
22     c=p2.x*p1.y-p2.y*p1.x;
23     q[num].a=a;
24     q[num].b=b;
25     q[num++].c=c;
26 }
27 void solve(int t)
28 {
29     int i,y;
30     int a,b;
31     if(p[t].x==p[t+1].x)
32     {
33         ans+=abs(p[t].y-p[t+1].y)-1;
34         return;
35     }
36     a=p[t].x;b=p[t+1].x;
37     if(p[t].x>p[t+1].x)
38     {
39         a=p[t+1].x;b=p[t].x;
40     }
41     for(i=a+1;i<b;i++)
42     {
43         y=q[t].a*i+q[t].c;
44         if(y%q[t].b==0)
45         ans++;
46     }
47 }
48 
49 int main()
50 {
51     int i;
52     int area;
53     while(scanf("%d%d%d%d%d%d",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y)!=EOF&&(p[0].x||p[0].y||p[1].x||p[1].y||p[2].x||p[2].y))
54     {
55         num=0;
56         p[3]=p[0];
57         area=0;
58         for(i=0;i<3;i++)
59         area+=p[i].x*p[i+1].y-p[i].y*p[i+1].x;
60         area=abs(area);
61         for(i=0;i<3;i++)
62         lines(p[i],p[i+1]);
63         ans=0;
64         for(i=0;i<3;i++)
65         solve(i);
66         ans+=3;
67         ans=(area-ans)/2+1;
68         printf("%d\n",ans);
69     }
70     return 0;
71 }
原文地址:https://www.cnblogs.com/zxj015/p/2740207.html