题目大意:
这个题目意思有点复杂,就是给你一些点,这些点里面一定有(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;
}
296

被折叠的 条评论
为什么被折叠?



