皮克定理 poj2954

來源:互聯網
上載者:User

一張方格紙上,上面畫著縱橫兩組平行線,相鄰平行線之間的距離都相等,這樣兩組平行線的交點,就是所謂格點。

  

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;}

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.