1. 程式人生 > >HDU 2036 叉乘求三角形面積

HDU 2036 叉乘求三角形面積

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 32071 Accepted Submission(s): 16490

Problem Description
“ 改革春風吹滿地,
不會AC沒關係;
實在不行回老家,
還有一畝三分地。
謝謝!(樂隊奏樂)”

話說部分學生心態極好,每天就知道遊戲,這次考試如此簡單的題目,也是雲裡霧裡,而且,還竟然來這麼幾句打油詩。
好呀,老師的責任就是幫你解決問題,既然想種田,那就分你一塊。
這塊田位於浙江省溫州市蒼南縣靈溪鎮林家鋪子村,多邊形形狀的一塊地,原本是linle 的,現在就準備送給你了。不過,任何事情都沒有那麼簡單,你必須首先告訴我這塊地到底有多少面積,如果回答正確才能真正得到這塊地。
發愁了吧?就是要讓你知道,種地也是需要AC知識的!以後還是好好練吧…

Input
輸入資料包含多個測試例項,每個測試例項佔一行,每行的開始是一個整數n(3<=n<=100),它表示多邊形的邊數(當然也是頂點數),然後是按照逆時針順序給出的n個頂點的座標(x1, y1, x2, y2… xn, yn),為了簡化問題,這裡的所有座標都用整數表示。
輸入資料中所有的整數都在32位整數範圍內,n=0表示資料的結束,不做處理。

Output
對於每個測試例項,請輸出對應的多邊形面積,結果精確到小數點後一位小數。
每個例項的輸出佔一行。

Sample Input
3 0 0 1 0 0 1
4 1 0 0 1 -1 0 0 -1
0

Sample Output
0.5
2.0

已知三角形的三角座標,可以利用行列式求三角形的面積,設三角形的三點座標為(x1,y1),(x2,y2),(x3,y3),
可知其面積為(x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)
但要注意的是這裡的面積是向量,帶正負號,在求實際問題的往往對結果用絕對值函式;
注:如果三角形三點的座標是按順時針方向給出,則S為負;按逆時針方向給出,則S為正。
AC程式碼:

#include <stdio.h>
#include <math.h>
#include <string.h>
double area(int x1,int
y1,int x2,int y2,int x3,int y3){ return (double) (x1*y2+x2*y3+x3*y1-y1*x2-y2*x3-y3*x1)/2; } int main (){ int n; while (scanf("%d",&n),n){ int arr[102][2],i,j; double sum = 0; for (i=0;i<n;i++) scanf("%d%d",&arr[i][0],&arr[i][1]); for (j=2;j<n;j++){ sum += area(arr[0][0],arr[0][1],arr[j-1][0],arr[j-1][1],arr[j][0],arr[j][1]); } printf("%.1lf\n",fabs(sum); } return 0; }

利用一個二維陣列,分別做x座標,和y座標,將N多邊形分解成若干個小三角形,依次求其面積,累加即可;