多边形的面积
题目描述
给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。
多边形被放置在一个X-Y的卡笛尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数(因此多边形的面积也为整数)。
输入输出格式
输入格式:
第一行给出多边形的顶点数n(n≤100)。接下来的几行每行给出多边形一个顶点的坐标值X和Y(都为整数并且用空格隔开)。顶点按逆时针方向逐个给出。并且多边形的每一个顶点的坐标值-200≤x,y≤200。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。
输出格式:
一个整数,表示多边形的面积。
输入输出样例
输出样例#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 }