poj 1654 Area 多边形面积

[size=medium][color=blue]
题目描述:[url]http://poj.org/problem?id=1654[/url]
题目大意:从平面坐标原点出发,1-9(除了5)表示不同的方向,最终保证回到原点,路径为一多边形,求多边形的面积。
解题思路:因为数据量较大,可以不用保存多边形的每个顶点信息,每次读一个数字(即读一段)就计算该线段与原点组成三角形的有向面积。

1.另外面积area 的保存用int 的话会溢出,所以选用long long(g++) 或__int64(vc6.0)。

2.dir 数组的设计方便求下一个点的坐标,想不到的话就直接switch语句 吧。

[/color][/size]

#include <iostream>
#include <cstring>
using namespace std;

struct point {
int x, y;
point() {
x = y = 0;
}
};

int main() {
int dir[10][2] = {0,0,-1,-1,0,-1,1,-1,-1,0,0,0,1,0,-1,1,0,1,1,1};
char path[1000005];
long long area; //用int 的话会溢出
int ncase;
cin>>ncase;
int len, num, i;
point back, cur;
while(ncase--) {
area = 0;
cin>>path;
len = strlen(path);
for(i = 0; i < len -1; i++) {
num = path[i] - '0';
cur.x = back.x + dir[num][0];
cur.y = back.y + dir[num][1];
area += back.y * cur.x - back.x * cur.y;
back = cur;
}
if(area < 0)
area = -area;
if(area % 2 == 0)
cout<<area / 2<<endl;
else
cout<<area / 2<<".5"<<endl; //.5 需要特殊处理
}
return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值