POJ1654叉積求多邊形面積

來源:互聯網
上載者:User
poj1654叉積求多邊形面積

叉積求多邊形面積

題意:以二維座標的原點為起點,每次只走一步,每步只走根號2的長度或1的長度,且每步走的方向八個:上/下/左/右/左上/左下/右上/右下,而且每個方向用一個數字代替,1 2 3 4 6 7 8 9,5代表終止,即最後一步回到了原點,構成了多邊形。現在給定一個以數字組成的字串,字串的每一個數字字元代表了走的方向,問走的路線構成的多邊形的面積是多少?

演算法:這題的字串長度可以達到10^6個,而且多邊形不分凹凸,這樣的話,就很難求它的面積。但可以用“叉乘”的特性來解些題。如|a×b|=|a|*|b|*sinθ,若a和b為三解形兩邊的向量,那麼這個三角形的面積就是S=|a×b|/2;利用向量叉乘的性質我們可以求出n個邊構成的多邊形的面積,但這些點的順序必須是確定的。

                       在計算多邊形面積時,只需要在平面中任意取一點,再取多邊形中相鄰兩點,把所有的計

                                                                                                                                                         

                               算結果相加,得出答案的絕對值就是多邊形的面積,下面舉幾個例子:            

                       例a : S = Soab + Sobc + Socd + Soda ,4個三角形都是順時針,面積為他們和的絕對值。

                                                                                                                                                                                      例b : S =Soab+Sobc+Socd+Soda ,4個三角形中後3個是順時針,後3個的絕對值的面積Sobcda,但是Soab為逆時針,符號與後三個相反,4個相加剛好把多餘的抵消。                                                                                                                                                               

                   例c,d:同理。

所以中心點可以任意選,對於些題,我們設中心點為(0,0),而且題中的輸入的字串的每個數字代表一個點(5除外),而且是有序的,這就符合要求了。

注意:1.字串用數組,而且這些點也用數組存的話,此題必然會超記憶體。所以,最好的方法是過程中取點,過程中輸入字元,這樣只需要兩個變數就可以解決問題了。

              2.還有一點得注意,對於此題中多邊形的面積,必定是0.5的整數倍,因為它由多個1*1的三角形組成,而在求sum時,sum=2*s,所以sum必定是一個整數,所以,我們可以用__int64類型的變數來存結果,如果用double可能存在精度丟失的情況,一般會wa。最後我們只需要判斷sum%2的值就能確定輸出是整數還是要加0.5了。

代碼:

#include<stdio.h>
int a[10][2]={{0,0},{-1,-1},{0,-1},{1,-1},{-1,0},{0,0},{1,0},{-1,1},{0,1},{1,1}};//方向向量,想起了廣搜的方向向量。。。

int main(){
 __int64 area;
 int i,n;
 char ch;
 int x1,y1,x2,y2;
 scanf("%d",&n);
 getchar();
 while(n--){
  area=0;x1=0;y1=0;
  while((ch=getchar())!='\0'){
   if(ch=='5') break;
   x2=x1+a[ch-'0'][0];
   y2=y1+a[ch-'0'][1];
   area+=x1*y2-x2*y1;
   x1=x2;
   y1=y2;
   
  }
  if(area<0)
  area=-area;
  printf(area%2==0?"%I64d\n":"%I64d.5\n",area/2);
 }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.