poj 1654 这题我想多了

来源:互联网 发布:java输入输出学生成绩 编辑:程序博客网 时间:2024/05/29 03:00

看到本题目简单分析了一下

只要解决两个问题就能搞定这一题。

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);}elseprintf("%I64d\n", ans / 2);}return 0;}

原创粉丝点击