小灰灰的籠外領地
【題目描述】
小灰灰在某天吃飽喝足後爬出了自己的籠子出來做運動。小灰灰作爲實驗室的明星鼠,大家當然不能讓它去一些危險的地方,因此春陽哥就在小灰灰籠前的平地上按照順時針順序點了幾個點,並用線將其順時針連接了起來。醬,小灰灰就擁有了一個屬於自己的安全的“籠外領地”啦!
小灰灰在領地中逛久了自然感覺無趣,因此,它想要做一些有挑戰的事情——寫個程序算出來它的領地究竟有多大!然而,小灰灰實在是太小了,甚至連鍵盤的鍵都按不下去,所以它只好來請你幫助他完成這個任務咯!
【輸入描述】
第一行一個整數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;