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;}
- poj 1654 这题我想多了
- 我想跑了
- 我想死你了
- 我想我變了
- 我想你了
- 对不起,我想你了!
- 是不是我想太多了
- 嗯,我想回家了
- 如果我想你了
- 我想回来了
- 如果我想你了
- 我想转行了
- 我想你了
- 我想写博客了
- 白雪我想你了!!
- 我想你了
- 吴攀红,我想你了。
- 我想你了,宝贝
- setValue和setObject的区别
- OK6410移植linux3.3.1
- c语言解复数的乘法,应用结构体
- 对三维数组进行排序,x相等时比较y的大小,y相等时比较z的大小,用到qsort函数。
- hibernate持久化对象状态 .
- poj 1654 这题我想多了
- 学hibernate的地方
- BloomFilter简易实现
- 在S3C2440上配置UART
- 想做硬件开发的人员必看
- ScrollLayout 的使用
- 在PropertyGrid使用JsonStore
- 锂电池充电的原理
- XEN的命令集