您的位置:首页 > 其它

nyoj 78 圈水池

2014-04-18 14:38 363 查看
http://acm.nyist.net/JudgeOnline/problem.php?pid=78

分析:简单的凸包问题,很适合入门练习。

思路也相对简单,就是graham扫描算法。

这是我的程序,初次写凸包代码,还很粗糙,见谅见谅。

#include<iostream>
#include<algorithm>

using namespace std;

struct point{
double x,y;
};

bool cmp(const point &l,const point &r)
{
return l.x<r.x||(l.x==r.x&&l.y<r.y);
}

bool mult( point sp ,point ep ,point op )
{
return (sp.x-op.x)*(ep.y-op.y)>=(ep.x-op.x)*(sp.y-op.y);
}

/*bool operator < (const point &l,const point &r)
{
return l.y<r.y||(l.y==r.y&&l.x<r.x);
}*/

int graham(point pnt[],int n,point res[])
{
int i,len,top=1;
sort(pnt,pnt+n,cmp);
if(n==0) return 0;res[0]=pnt[0];
if(n==1) return 1; res[1]=pnt[1];
for(i=2;i<n;i++)
{
while(top&&mult(pnt[i],res[top],res[top-1]))
top--;
res[++top]=pnt[i];
}
len=top;
res[++top]=pnt[n-2];
for(i=n-3;i>=0;i--)
{
while(top!=len&&mult(pnt[i],res[top],res[top-1]))
top--;
res[++top]=pnt[i];
}
return top;
}

int main()
{
int K,m,i,j,tmp;
point pnt[103],res[103];
cin>>K;
while(K--)
{
cin>>m;
for(i=0;i<m;i++)
{
cin>>pnt[i].x>>pnt[i].y;
}
tmp=graham(pnt,m,res);
sort(res,res+tmp,cmp);
for(i=0;i<tmp;i++)
cout<<res[i].x<<" "<<res[i].y<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NYOJ 88