题目大意:
这个题目意思有点复杂,就是给你一些点,这些点里面一定有(0,0)原点,并且没有第二象限中的点,这些点是一个凸包。
让你从原点开始按顺序输出凸包上的点。看看例子我们就清楚了。
例如输入的点是:
0 0 70 -50 60 30 -30 -50 80 20 50 -60 90 -20 -30 -40 -10 -60 90 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_ep double 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; } else return (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; }