一張方格紙上,上面畫著縱橫兩組平行線,相鄰平行線之間的距離都相等,這樣兩組平行線的交點,就是所謂格點。
a=39,b=14,s=45
如果取一個格點做原點O,1,取通過這個格點的橫向和縱向兩直線分別做橫座標軸OX和垂直軸OY,並取原來方格邊長做單位長,建立一個座標系。這時前面所說的格點,顯然就是縱橫兩座標都是整數的那些點。1中的O、P、Q、M、N都是格點。由於這個緣故,我們又叫格點為整點。
一個多邊形的頂點如果全是格點,這多邊形就叫做格點多邊形。有趣的是,這種格點多邊形的面積計算起來很方便,只要數一形邊線上的點的數目及圖內的點的數目,就可用公式算出。
這個公式是皮克(Pick)在1899年給出的,被稱為“皮克定理”,這是一個實用而有趣的定理。
//一個計算點陣中頂點在格點上的多邊形面積公式:S=a+b÷2-1,其中a表示多邊形內部的點數,b表示多邊形邊界上的點數,s表示多邊形的面積。
#include<iostream>#include<cmath>using namespace std;struct point{ int x,y;};int gcd(int m,int n){if(n==0) return m;return gcd(n,m%n);}int bian(point A,point B)//算出點A和點B組成的線段上的點{return gcd(abs(A.x-B.x),abs(A.y-B.y))+1;}int f(point a[],int n)//求n邊形的面積{int i,ans=0;a[n]=a[0];for(i=0;i<n;i++)ans+=(a[i].x*a[i+1].y-a[i].y*a[i+1].x);if(ans<0) ans=-ans;return ans;}int main(){ int s,ans; point a[4]; while(cin>>a[0].x>>a[0].y>>a[1].x>>a[1].y>>a[2].x>>a[2].y) { if(!(a[0].x||a[0].y||a[1].x||a[1].y||a[2].x||a[2].y)) break; s=bian(a[0],a[1])+bian(a[1],a[2])+bian(a[2],a[0])-3;//-3是因為重複算了3個頂點 //cout<<"s="<<s<<endl; ans=f(a,3); //cout<<"ans="<<ans<<endl; cout<<(ans-s)/2+1<<endl; }return 0;}