小灰灰的笼外领地
【题目描述】
小灰灰在某天吃饱喝足后爬出了自己的笼子出来做运动。小灰灰作为实验室的明星鼠,大家当然不能让它去一些危险的地方,因此春阳哥就在小灰灰笼前的平地上按照顺时针顺序点了几个点,并用线将其顺时针连接了起来。酱,小灰灰就拥有了一个属于自己的安全的“笼外领地”啦!
小灰灰在领地中逛久了自然感觉无趣,因此,它想要做一些有挑战的事情——写个程序算出来它的领地究竟有多大!然而,小灰灰实在是太小了,甚至连键盘的键都按不下去,所以它只好来请你帮助他完成这个任务咯!
【输入描述】
第一行一个整数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;