Graham扫描算法极角排序版

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include
#include
#include
using namespace std;
#define exp 1e-9
struct Node
{
int x,y;
}point[50005];
int det(int x1,int y1,int x2,int y2);
int cross(Node a,Node b,Node c);
int dist(Node a,Node b);
int comp(const Node &a,const Node &b);
int distan(Node a,Node b);
int graham();
Node stack[50005];
int n;
int main()
{
// ifstream cin("in.txt");
int i,j;
while(cin>>n)
{
for(i=0;icin>>point[i].x>>point[i].y;
int num=graham();
int Max=0,temp=0;
for(i=0;i<=num;i++)
for(j=0;j<=num;j++)
{
if(i==j)continue;
temp=distan(stack[i],stack[j]);
if(temp>Max)
Max=temp;
}
cout<}
return 0;
}
int det(int x1,int y1,int x2,int y2)
{
return x1*y2-x2*y1;
}
int cross(Node a,Node b,Node c)
{
return det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
}
int distan(Node a,Node b)
{
return (b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y);
}
int dist(Node a,Node b)
{
return (int)sqrt((double)(b.x-a.x)*(b.x-a.x)+(double)(b.y-a.y)*(b.y-a.y));
}
int comp(const Node &a,const Node &b)
{
if(cross(point[0],a,b)<0)return 0;
if(cross(point[0],a,b)>0)return 1;
if(dist(point[0],a)return 1;
else return 0;
}
int graham()
{
int i;
int left=0;
for(i=1;i{
if(point[i].xleft=i;
if(point[i].x==point[left].x&&point[i].yleft=i;
}
Node t;
t=point[0];
point[0]=point[left];
point[left]=t;
sort(point,point+n,comp);
stack[0]=point[0];
stack[1]=point[1];
stack[2]=point[2];
int top=2;
for(i=3;i{
while(cross(stack[top-1], stack[top],point[i])<0)
top--;
stack[++top]=point[i];
}
return top;
}

相关文档
最新文档