ZOJ1032 Area 2

 /*

假设:
边数:m
每次移动的距离:dx、dy
开始坐标:0 0
k次移动后的坐标:move[k].x move[k].y (1<=k<=m)

E=∑每次移动的dx、dy的最大公约数
2*area=∑(move[k].x * move[k+1].y - move[k+1].x * move[k].y) (1<=k<=m-2)
I=(area+2-E)/2

*/
#include<iostream>
using namespace std;

struct dist
{
int dx;
int dy;
};

dist move[101];

int **(int a,int b)
{
if(a==0)
return b;
if(b==0)
return a;
return **(b,a%b);
}

int main()
{
int num,m,I,E,area;
int i,j;
cin>>num;

for(j=1;j<=num;j++)
{
I=E=area=0;
cin>>m;

move[0].dx=0;
move[0].dy=0;
for(i=1;i<=m;i++){
cin>>move[i].dx>>move[i].dy;
E+=**(abs(move[i].dx),abs(move[i].dy));
}

for(i=1;i<=m;i++)
{
move[i].dx+=move[i-1].dx;
move[i].dy+=move[i-1].dy;
}

for(i=1;i<m-1;i++){
area+=move[i].dx*move[i+1].dy-move[i+1].dx*move[i].dy;
}
area=abs(area);

I=(area+2-E)/2;

cout<<"Scenario #"<<j<<":"<<endl;
cout<<I<<' '<<E<<' ';
if(area%2!=0)
cout<<area/2+0.5<<endl;
else
cout<<area/2<<".0"<<endl;
cout<<endl;

for(i=0;i<=m;i++)
{
move[i].dx=0;
move[i].dy=0;
}
}
return 0;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值