hdu oj 2036 改革春风吹满地 (凸多边形面积)
题目描述(转自:http://acm.hdu.edu.cn/showproblem.php?pid=2036)
这是一道典型的求一个凸多边形面积的题,对于求解凸多边形面积,通常的思路就是将该多边形分割成多个可解的简单多边形,例如三角形或者矩形。
对于连续和非连续的分布,分别可以采用积分法和三角形点分割的方式进行求解。
对于本题,易知是多个非连续的点集合,而且点的排序方式为逆时针,这是一个非常关键的假设,根据该假设我们可以把该多边形一次分割成多个相邻的不重叠三角形,再利用三角形面积公式递归求解
上图是分割的一个示例图,通过一次分割,可将原凸七边形分割成5个相邻的三角形,接下来我们引入通过三顶点坐标求解三角形面积的公式:
若已知一个三角形的三个顶点坐标分别为: (x1,y1)(x2,y2)(x3,y3) 则该三角形的面积可以表示为:(转自:吴进权,张达,《凸多边形的一个面积公式》高等函授学报(自然科学版)第22卷第2期,2009年4月)
根据定理,我们即可得到本题的解法,代码如下:
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 double s,p[100][2]={0}; 5 int n,i; 6 int main() 7 { 8 while(cin>>n && n) 9 { 10 s=0.0; 11 for(i=0;i<n;i++) 12 cin>>p[i][0]>>p[i][1]; 13 for(i=2;i<n;i++) 14 s+= (p[i-1][0]-p[0][0])*(p[i][1]-p[0][1]) -(p[i-1][1]-p[0][1])*(p[i][0]-p[0][0]); 15 s/=2.0; 16 cout<<setiosflags(ios::fixed)<<setprecision(1)<<s<<endl; 17 } 18 return 0; 19 }
最后注意题目中关于输出的要求。
转载请注明出处: http://www.cnblogs.com/double-win/ 谢谢!