1. 程式人生 > >hdu 2036 求多邊形面積 (凸、凹多邊形)

hdu 2036 求多邊形面積 (凸、凹多邊形)

node 開始 責任 clas 簡化 memset abs 得到 algo

<題目鏈接>

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 解題分析:
求多邊形面積不難,把該多邊形分成多個三角形,然後根據三角形的叉乘,求出每一個三角形的面積,然後相加,即得到該多邊形的面積。但是,非常重要的一點是,用叉乘的方法求出三角形的面積是有向面積,並且枚舉三角形頂點時,必須是逆時針取,所以,對於凹邊形,不要天真的以為每一個三角形的面積求出來都要是正數,畫蛇添足的對每一個求出來的三角形取絕對值,我就在這裏WA了好幾次。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include 
<stdlib.h> using namespace std; struct node { int x, y; node() {} node(int a, int b) :x(a), y(b) {} }; node arr[110]; double XMul(node a, node b) { //return fabs(a.x*b.y*1.0 - a.y*b.x*1.0)*0.5; 不能這樣寫,因為這個多邊形可能是凹多邊形 return (a.x*b.y*1.0 - a.y*b.x*1.0)*0.5; } double area(node a, node b) { //p1,p2分別為該三角形的兩個向量邊 node p1 = node(arr[1].x - a.x, arr[1].y - a.y); node p2 = node(arr[1].x - b.x, arr[1].y - b.y); return XMul(p1, p2); } int main() { int n; while (scanf("%d", &n) != EOF, n) { memset(arr, 0, sizeof(arr)); double sum = 0; for (int i = 1; i <= n; i++) { scanf("%d %d", &arr[i].x, &arr[i].y); } node last = arr[2]; for (int i = 3; i <= n; i++) { sum += area(last, arr[i]); last = arr[i]; } printf("%.1lf\n", fabs(sum)); //對sum取絕對值才是正解 } return 0; }
2018-08-01

hdu 2036 求多邊形面積 (凸、凹多邊形)