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 }