多边形的面积

题目描述

给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。

多边形被放置在一个X-Y的卡笛尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数(因此多边形的面积也为整数)。

输入输出格式

输入格式:

第一行给出多边形的顶点数n(n≤100)。接下来的几行每行给出多边形一个顶点的坐标值XY(都为整数并且用空格隔开)。顶点按逆时针方向逐个给出。并且多边形的每一个顶点的坐标值-200≤x,y≤200。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。

输出格式:

一个整数,表示多边形的面积。

输入输出样例

输入样例#1: 
10
0 0
4 0
4 1
3 1
3 3
2 3
2 2
1 2
1 3
0 3
输出样例#1: 
9

分析:
谁说这题是模拟的??站出来我打死你我。。。一道变态的数学题(计算几何)。。。将一个多边形分为多个三角形进行计算求解。。。具体解释太过麻烦。。。详细看:大佬的分析


CODE:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <iostream>
 5 #include <algorithm>
 6 #include <stack>
 7 #define M 1000000
 8 using namespace std;
 9 int n,x[M],y[M],ans;
10 int read(){
11     char c=getchar();int ans=0;bool flag=1;
12     while (c<'0'||c>'9'){if (c=='-') flag=0;c=getchar();}
13     while (c>='0'&&c<='9') ans=(ans<<1)+(ans<<3)+(c^48),c=getchar();
14     if (flag) return ans;return ~ans+1;
15 }
16 int main(){
17     n=read();
18     for (int i=1;i<=n;i++) x[i]=read(),y[i]=read();
19     x[n+1]=x[1],y[n+1]=y[1];
20     for (int i=1;i<=n;i++)
21         ans+=(x[i]-x[i+1])*(y[i]+y[i+1]);
22     printf("%d",ans/2);
23     return 0;
24 }

 

 
posted @ 2019-07-15 12:55  Sword_Art_Online  阅读(471)  评论(0编辑  收藏  举报