poj2007
来源:互联网 发布:万有理论 知乎 编辑:程序博客网 时间:2024/06/06 13:56
题目大意:
这个题目意思有点复杂,就是给你一些点,这些点里面一定有(0,0)原点,并且没有第二象限中的点,这些点是一个凸包。
让你从原点开始按顺序输出凸包上的点。看看例子我们就清楚了。
例如输入的点是:
0 070 -5060 30-30 -5080 2050 -6090 -20-30 -40-10 -6090 10
构成的凸包是:
输出的序列是:
(0,0)(-30,-40)(-30,-50)(-10,-60)(50,-60)(70,-50)(90,-20)(90,10)(80,20)(60,30)
就是按照凸包上的点输出的。
算法很简单,求凸包,还是模板啦。然后找到凸包中(0,0)的位置,从(0,0)开始,将凸包上的点按照顺序输出,如果到了数组的末端,然后接着从0开始,直到输出凸包上的所有点就OK了。
直接上代码了:
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <cstdlib>using namespace std;struct POINT {int x,y;double angle;}point[60],stack[60];int n, top;typedef struct POINT Point;//欧氏距离double Distance(Point p1, Point p2){return sqrt((double)((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)));}//叉积 op_sp × op_epdouble multily(Point sp, Point ep, Point op){return (double)((sp.x - op.x) * (ep.y - op.y) - (ep.x - op.x) * (sp.y - op.y));}//比较函数从小到大int cmp(const void *a, const void *b){Point *c = (Point *)a;Point *d = (Point *)b;if (c->angle > d->angle){return 1;}else if(c->angle < d->angle){return -1;}elsereturn (c->x * c->x + c->y * c->y) < (d->x * d->x + d->y * d->y) ? -1 : 1;}//求凸包void Graham_scan(){int i;stack[0] = point[0];stack[1] = point[1];stack[2] = point[2];for (i = 3; i < n; ++ i){while (multily(point[i], stack[top], stack[top - 1]) > 0){top --;}stack[++ top] = point[i];}}int main(){int i, k;top = 2;k = 0;i = 0;while(scanf("%d %d", &point[i].x, &point[i].y) != EOF){++ i;}n = i;for (i = 1; i < n; ++ i){if (point[i].y < point[k].y || (point[i].y == point[k].y && point[i].x < point[k].x)){k = i;}}if (k){Point tmp = point[0];point[0] = point[k];point[k] = tmp;}for (i = 1; i < n; ++ i){point[i].angle = atan2((double)(point[i].y - point[0].y), (double)(point[i].x - point[0].x));}qsort(point + 1, n - 1, sizeof(point[0]),cmp);Graham_scan();for (i = 0; i <= top; ++ i){if (stack[i].x == 0 && stack[i].y == 0){break;}}for (k = 0; k <= top; ++ k){printf("(%d,%d)\n", stack[(i + k) % (top + 1)].x, stack[(i + k) % (top + 1)].y);}return 0;}
- POJ2007
- poj2007
- poj2007
- poj2007
- poj2007
- POJ2007 Scrambled Polygon
- POJ2007 凸包
- POJ2007 凸包计算
- poj2007极角排序
- POJ2007 Scrambled Polygon
- POJ2007-Scrambled Polygon
- POJ2007--Scrambled Polygon
- POJ2007 Scrambled Polygon
- POJ2007 Scrambled Polygon
- poj2007——Scrambled Polygon
- poj2007凸包graham逆时针输出
- POJ2007 Scrambled Polygon 凸多边形顶点输出
- [POJ2007]Scrambled Polygon(计算几何)
- C#下载 .jar文件
- 20110920
- 【黑马程序员】IO输入与输出(三)之包装类
- spring aop与strut2的拦截器冲突
- 黑书 P20 例题3——聪明的学生
- poj2007
- HDOJ1013水题
- IT人必须学会的职场四原则
- max_list(任意整形参数列表)
- PC串行端口地址及寄存器功能详细资料
- Java Socket通信相关机制
- scanf函数 ~~
- 使用CakePHP快速建立Restful服务
- MYSQL--语法