杭电ACM--2036,求任意多边形的面积(思维)

这道题中“每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2… xn, yn)”这么一句话是关键,下面所采用的公式只有按一定顺序输出顶点坐标才能采用。
下面就是任意多边形的面积公式(矩阵形式),建议牢记。
在这里插入图片描述

代码如下:


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
double x[1005],y[1005];
int main()
{
int n;
int i,j;
double a,b,c,sum,p;
while(~scanf("%d",&n)&&n)
{
sum=p=0;
// sum=a=b=p=c=0;
for(i=1;i<=n;i++)
    scanf("%lf %lf",&x[i],&y[i]);
for(i=1;i<=n;i++)
{
if(i
{
p=p+x[i]*y[i+1]-x[i+1]*y[i];
}
else p=p+x[n]*y[1]-x[1]*y[n];
}
sum=p/2.0;
////////////////////////////////////////////////////////////////////////////////////////
                下面采用的是海伦公式,但不能AC,因为海伦公式不一定能解决凹多边形的情况。
// for(i=2;i<=n-1;i++)
// {
// a=sqrt((x[1]-x[i]) * (x[1]-x[i]) + (y[1]-y[i]) * (y[1]-y[i]));
// b=sqrt((x[1]-x[i+1]) * (x[1]-x[i+1]) + (y[1]-y[i+1]) * (y[1]-y[i+1]));
// c=sqrt((x[i+1]-x[i]) * (x[i+1]-x[i]) + (y[i+1]-y[i]) * (y[i+1]-y[i]));
// p=(a+b+c)/2.0;
// sum=sum+sqrt(p*(p-a)*(p-b)*(p-c));
// printf("%.2lf %.2lf %.2lf %.2lf %.2lf\n",a,b,c,p,sum);
// }
printf("%.1lf\n",sum);
}
return 0;
 } 

猜你喜欢

转载自blog.csdn.net/shamansi99/article/details/86818118