poj2187 凸包

来源:互联网 发布:网络大学考试平台 编辑:程序博客网 时间:2024/05/16 00:54

题目:http://poj.org/problem?id=2187

给出n个点的坐标,求出点之间最长距离的平方。

解:构建凸包,最长距离的点必在凸包上,暴力枚举凸包上的点,可以过,不超时。

凸包算法,看poj1113文章

 

 

#include<stdio.h>#include<stdlib.h>#include<math.h>struct aa{int x,y;double angle;}point[51000],stack[51000];double count(int x1,int y1,int x2,int y2){return atan2((double)(y1-y2),(double)(x1-x2));}void angle(int n,int m){int i;point[m].angle=-1;for(i=1;i<=n;i++)if(i!=m)point[i].angle=count(point[i].x,point[i].y,point[m].x,point[m].y);}int cmp(const void *a,const void *b){struct aa *c=(struct aa *)a;struct aa *d=(struct aa *)b;if(c->angle!=d->angle)return (c->angle>d->angle)?1:-1;elseif(c->x!=d->x)return c->x-d->x;return c->y-d->y;}int dist(int x1,int y1,int x2,int y2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);}int cross(int x1,int y1,int x2,int y2){return ((x1*y2)-(x2*y1)>0)?1:0;}int Gansan(int n,int top){int i,j;for(i=4;i<=n;i++){while(top>=2){if(cross(stack[top].x-stack[top-1].x,stack[top].y-stack[top-1].y,point[i].x-stack[top].x,point[i].y-stack[top].y)){stack[++top]=point[i];break;}elsetop--;}if(top==1)stack[++top]=point[i];}return top;}int main(){int i,j,n,m,top,num;scanf("%d",&n);for(i=1,m=1;i<=n;i++){scanf("%d%d",&point[i].x,&point[i].y);if(point[i].y<point[m].y||(point[i].y==point[m].y&&point[i].x<point[m].x))m=i;}//计算极角angle(n,m);//极角排序qsort(point+1,n,sizeof(point[0]),cmp);if(n==2){printf("%d\n",dist(point[1].x,point[1].y,point[2].x,point[2].y));return 0;}stack[1]=point[1];stack[2]=point[2];stack[3]=point[3];top=3;top=Gansan(n,top);for(i=1,m=-1;i<top;i++){for(j=i+1;j<=top;j++){num=dist(stack[i].x,stack[i].y,stack[j].x,stack[j].y);if(m<num)m=num;}}printf("%d\n",m);return 0;}

原创粉丝点击