题意:给出凸包的个个顶点 从(0,0)点开始逆时针输出凸包顶点
分析 :凸包顶点都给你了 计算一遍存下来 然后找到(0,0)点 按照逆时针顺序 对应数组中的点 输出就是了
下面看代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Point
{
int x,y;
}s[55],str[55];
typedef struct Point point;
int cmp(point a,point b)//排序参数x从小到大排 x相同y从小到大排
{
if(a.x<b.x)return 1;
if(a.x==b.x&&a.y>b.y)return 1;
return 0;
}
//极角比较, 返回-1: p0p1在p0p2的右侧,返回0:p0,p1,p2共线
int Cross(struct Point p1, struct Point p2, struct Point pb)
{
int delta=(p1.x-pb.x)*(p2.y-pb.y)-(p2.x-pb.x)*(p1.y-pb.y);
if (delta<0) return 1;
else if (delta==0) return 0;
else return -1;
}
int ConvexHull(point *p,int n,point *ch)//Andrew法寻找凸包 必须先排序
{
int m = 0;
for(int i = 0; i < n; i++)//寻找下凸包
{
while(m > 1 && Cross(ch[m-1],p[i],ch[m-2]) <= 0 )m--;
ch[m++] = p[i];
}
int k = m;
for(int i = n-2; i >= 0; i--)//寻找上凸包
{
while(m > k && Cross(ch[m-1],p[i],ch[m-2]) <= 0 )m--;
ch[m++] = p[i];
}
if(n > 1)m--;
return m;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int T;
for(T = 0; scanf("%d%d",&s[T].x,&s[T].y)!=EOF; T++);
sort(s,s+T,cmp);
int m = ConvexHull(s,T,str);
int k;
for(k = 0; k <= m; k++)
if(str[k].x == 0)break;
for(int j = k; j > 0; j--)
printf("(%d,%d)\n",str[j].x,str[j].y);
for(int j = m; j > k; j--)
printf("(%d,%d)\n",str[j].x,str[j].y);
return 0;
}