题目描述 Description
给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。
多边形被放置在一个X-Y的卡笛尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数(因此多边形的面积也为整数)。
输入描述 Input Description
输入文件第一行给出多边形的顶点数n(n≤100)。接下来的几行每行给出多边形一个顶点的坐标值X和Y(都为整数并且用空格隔开)。顶点按逆时针方向逐个给出。并且多边形的每一个顶点的坐标值-200≤x,y≤200。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。
输出描述 Output Description
输出文件仅有一行包含一个整数,表示多边形的面积。
样例输入 Sample Input
10
0 0
4 0
4 1
3 1
3 3
2 3
2 2
1 2
1 3
0 3
样例输出 Sample Output
9
思路
经典模板题
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
const double eps=1e-10;
int n,p;
struct Point
{
double x, y;
double len() {return sqrt(x * x + y * y);}
Point(double _=.0,double __=.0):x(_),y(__) {}
};
Point operator +(const Point &r,const Point &s)
{return Point(r.x+s.x,r.y+s.y);}
Point operator -(const Point &r,const Point &s)
{return Point(r.x-s.x,r.y-s.y);}
Point operator *(const Point &r,double s)
{return Point(r.x*s,r.y*s);}
Point operator /(const Point &r,double s)
{return Point(r.x/s,r.y/s);}
//点
vector <Point> poly;
int sign(double a)
{return (a>eps)?1:(a<-eps)?-1:0;}//判断正负
double dot(const Point &r, const Point &s)
{return r.x*s.x+r.y*s.y;}//点积
double cross(const Point &r, const Point &s)
{return r.x*s.y-r.y*s.x;}//叉积
double area(const vector<Point> &poly)
{
double rt=0.0;
int n=(int)poly.size();
for (int i=0;i<n;i++)
rt+=cross(poly[i],poly[(i+1)%n]);
return fabs(rt/2.0);
}//多边形的面积
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
double x,y;
scanf("%lf%lf",&x,&y);
poly.push_back(Point(x,y));
}
printf("%.0lf\n",area(poly));
return 0;
}