Graham扫描算法极角排序版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;i
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)
else return 0;
}
int graham()
{
int i;
int left=0;
for(i=1;i
if(point[i].x
if(point[i].x==point[left].x&&point[i].y
}
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;
}