看到本题目简单分析了一下
只要解决两个问题就能搞定这一题。
1、面积为0的情况,分两种,一种是一条直线,一种是折线走出去,在原路返回
2、求出所有点坐标,求任意多边形的面积
这两个问题都很容易解决。
1、直线情况也就两个对角线,和水平垂直。原路返回的可以将反向的标示当做是一样的,比如2和8都当做8,如果这个字符串是回文,那么就是原路返回
2、任意多边形面积,这个直接求相邻点的叉积就可以了。实际上就是根据矢量面积来计算的,这个这里不多做解释,搜一下求任意多边形面积,网上很多解释,大家可以看看。
后来我发现我想多了,第一种情况就是第二种的特殊情况,没必要单独列出来,悲剧啊。
另外注意的是必须要用long long保存结果,因为结果数很大。还有一点疑惑,没看出来题目哪里说北是向下的,我们都是上北下南左西右东,这里刚好反了。。。。
理解了上面的解释,代码就很简单了。水题不水啊。。。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
__int64 func(__int64 x1, __int64 y1, __int64 x2, __int64 y2)
{
return (x1 * y2 - x2 * y1);
}
int main()
{
char ch[1000001];
__int64 x1, y1, x2, y2, ans = 0;
int d[10][2] = {{0,0},{1,-1},{1,0},{1,1},{0,-1},{0,0},{0,1},{-1,-1},{-1,0},{-1,1}};
int n, i,j,p;
scanf("%d", &n);
while (n --)
{
scanf("%s", ch);
ans = 0;
x1 = y1 = 0;
j = strlen(ch);
for (i = 0; i < j - 1; ++ i)
{
p = ch[i] - '0';
x2 = x1 + d[p][0];
y2 = y1 + d[p][1];
ans += func(x1, y1, x2, y2);
x1 = x2;
y1 = y2;
}
if (ans < 0)
{
ans = 0 - ans;
}
if (ans % 2)
{
printf("%I64d.5\n", ans / 2);
}
else
printf("%I64d\n", ans / 2);
}
return 0;
}