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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿