計蒜客 I小灰灰的籠外領地(計算多邊形面積)

小灰灰的籠外領地
【題目描述】

小灰灰在某天吃飽喝足後爬出了自己的籠子出來做運動。小灰灰作爲實驗室的明星鼠,大家當然不能讓它去一些危險的地方,因此春陽哥就在小灰灰籠前的平地上按照順時針順序點了幾個點,並用線將其順時針連接了起來。醬,小灰灰就擁有了一個屬於自己的安全的“籠外領地”啦!

小灰灰在領地中逛久了自然感覺無趣,因此,它想要做一些有挑戰的事情——寫個程序算出來它的領地究竟有多大!然而,小灰灰實在是太小了,甚至連鍵盤的鍵都按不下去,所以它只好來請你幫助他完成這個任務咯!

【輸入描述】
第一行一個整數T,表示有T(1<=T<=20)組數據。
對於每組數據:

第一行兩個整數n ( 1 ≤ n≤10,000),表示春陽哥點了n個點。

接下來n行,每行兩個實數x,y ( |x|,|y| ≤ 1,000),表示點的橫縱座標。

點以順時針順序給出,輸入數據保證圖形爲多邊形。

【輸出描述】
對於每組數據,輸出一個實數,表示小灰灰的領地面積。

輸出保留兩位小數。

樣例輸入

1
3
1 1
1 2
2 2

樣例輸出

0.50

Code:

#include<iostream>
#include<cstdio>
using namespace std;
double ans;
int n;
struct Point
{
    double x,y;
} a[1000005];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            cin>>a[i].x>>a[i].y;

        }
        ans=0;
        for(int i=2; i<=n; i++)
            ans+=(double)(a[i].x*a[i-1].y-a[i].y*a[i-1].x)/2.0;

        ans+=(double)(a[1].x*a[n].y-a[1].y*a[n].x)/2.0;
        if(ans<0.0)
            ans=-ans;
        printf("%.2lf\n",ans);
    }

    return 0;
}


公式:
for(int i=2; i<=n; i++)
ans+=(double)(a[i].x a[i-1].y-a[i].y a[i-1].x)/2.0;

ans+=(double)(a[1].xa[n].y-a[1].ya[n].x)/2.0;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章