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 }

你可能感兴趣的:(poj)