[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]
题目描述:[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;
}