题目链接:POJ 1654 Area
计算多边形面积,利用叉积可以方便的计算任意边数的多边形面积,凹凸多边形都可以。首先规定一个方向,然后选取多边形上的一个点作为起点,之后依次选择相邻两个点,计算这两个点与起点组成的三角形的有向面积。
这个题选取原点作为起点,之后计算有向面积相加就可以了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int MAX_N = 1000000 + 100;
char dir[MAX_N];
void get_dir(int &x, int &y, char c)
{
switch(c)
{
case '8':
y++;
break;
case '2':
y--;
break;
case '6':
x++;
break;
case '4':
x--;
break;
case '9':
x++, y++;
break;
case '7':
x--, y++;
break;
case '3':
x++, y--;
break;
case '1':
x--, y--;
break;
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s", dir);
int x1, y1, x2, y2;
x1 = x2 = y1 = y2 = 0;
int len = strlen(dir);
get_dir(x1, y1, dir[0]);
x2 = x1, y2 = y1;
for(int i = 1; i < len - 1; i++)
{
get_dir(x2, y2, dir[i]);
area += x1 * y2 - y1 * x2;
x1 = x2, y1 = y2;
}
if(area < 0)
area = (-1) * area;
if(area % 2 == 0)
printf("%lld\n", area / 2);
else
printf("%lld.5\n", area / 2);
}
return 0;
}