supersuperna123 2016-04-27 11:55 采纳率: 100%
浏览 1372

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

输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数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 2016-04-27 22:44
    关注
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!