2 supersuperna123 supersuperna123 于 2016.04.27 19:55 提问

本想牛刀小试没想到刀被砍卷刃了 一道小题 新手求指点 谢谢了

输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。

Output
对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
每个实例的输出占一行。

Sample Input
3 0 0 1 0 0 1
4 1 0 0 1 -1 0 0 -1
0

Sample Output
0.5
2.0
代码如下
#include
int f(int o)
{
if(o {
o=-1*o;
}
return o;
}
int main()
{
int n,m=0;
int a[100];
int i=0,hight=0,wide=0;
float area=0,exc=0;
int maxy1=0,maxy2=0,maxx1=0,maxx2=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
m=2*n;
for(i=0;i {
scanf("%d",&a[i]);
}
maxy2=maxy1=a[1];
for(i=1;i {
if(maxy1 {
maxy1=a[i];
}
if(maxy2>a[i])
{
maxy2=a[i];
}
i=i+2;
}
if(maxy1==maxy2)
{
hight=maxy1;
}
else
{
hight=f(maxy1)+f(maxy2);
}
maxx2=maxx1=a[0];
for(i=0;i {
if(maxx1>a[i])
{
maxx1=a[i];
}
if(maxx2<a[i])
{
maxx2=a[i];
}
}
if(maxx2==maxx1)
{
wide=maxx1;
}
else
{
wide=f(maxx1)+f(maxx2);
}
area=wide*hight;
exc=0;
for(i=0;i<m;)
{
if((a[i]!=a[i+2]) && (a[i+1]!=a[i+3]))
{
exc=exc+f(a[i]-a[i+2])*(f(a[i+1])+f(a[i+3]))*0.5;
}
i=i+2;
}
if((a[0]!=a[m-2]) && (a[1]!=a[m-1]))
{
exc=exc+f(a[0]-a[m-2])*(f(a[1])+f(a[m-1]))*0.5;

    }
    area=area-exc;
    printf("%.1f\n",area);
}
return 0;

}
////有在网上查过这道题用一个求多边行的公式来解决 可是最开始没没有知道这个公式于是自己想了用把图形填成长方形然后减去多余的面积的方法来做 (相比第一个办法这个确实好麻烦 - -)但是自己敲了这么多想知道是那里的问题好总结下经验 (测试数据已过)求大神指点一下 谢谢了 (代码有点多 再次感谢热心人 谢谢)

1个回答

devmiao
devmiao   Ds   Rxr 2016.04.28 06:44
supersuperna123
supersuperna123 谢谢
一年多之前 回复
supersuperna123
supersuperna123 谢谢
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!