给你俩凸包,问你它们的最短距离。

咋做就不讲了,经典题,网上一片题解。

把凸包上的点逆时针排序。可以取它们的平均点,然后作极角排序。

旋转卡壳其实是个很模板化的东西……

先初始化分别在凸包P和Q上取哪个点,一般在P上取纵坐标最小的点,在Q上取纵坐标最大的点

for i=1 to n(n是凸包P上的点数)

{

while(两条边的叉积>0)

{

  凸包Q上的点++

}

计算当前两条边之间的答案(或者说每条边的2个端点到另一条边的答案)

凸包P上的点++

}

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define EPS 0.0000000001
struct Point
{
double x,y;
Point(){}
Point(const double &X,const double &Y)
{
x=X;
y=Y;
}
double Length()
{
return sqrt(x*x+y*y);
}
}p[2][10010],bao[2][10010],ave;
typedef Point Vector;
Vector operator - (const Point &a,const Point &b)
{
return Vector(a.x-b.x,a.y-b.y);
}
bool cmp (const Point &a,const Point &b)
{
return atan2((a-ave).y,(a-ave).x)<atan2((b-ave).y,(b-ave).x);
}
double Cross(const Vector &a,const Vector &b)
{
return a.x*b.y-a.y*b.x;
}
double Dot(const Vector &a,const Vector &b)
{
return a.x*b.x+a.y*b.y;
}
double calc(Point P,Point A,Point B)
{
Vector v1=B-A,v2=P-A,v3=P-B;
if(Dot(v1,v2)<EPS) return v2.Length();
else if(Dot(v1,v3)>(-EPS)) return v3.Length();
else return fabs(Cross(v1,v2))/v1.Length();
}
int n,m;
int main()
{
//freopen("y.in","r",stdin);
while(1)
{
scanf("%d%d",&n,&m);
if(n==0 && m==0)
break;
for(int i=0;i<n;++i)
{
scanf("%lf%lf",&p[0][i].x,&p[0][i].y);
ave.x+=p[0][i].x;
ave.y+=p[0][i].y;
}
ave.x/=(double)n;
ave.y/=(double)n;
for(int i=0;i<m;++i)
scanf("%lf%lf",&p[1][i].x,&p[1][i].y);
sort(p[0],p[0]+n,cmp);
ave.x=ave.y=0;
for(int i=0;i<m;++i)
{
ave.x+=p[1][i].x;
ave.y+=p[1][i].y;
}
ave.x/=(double)m;
ave.y/=(double)m;
sort(p[1],p[1]+m,cmp);
int nowP=0,nowQ=0;
for(int i=1;i<n;++i)
if(p[0][i].y-p[0][nowP].y<(-EPS))
nowP=i;
for(int i=1;i<m;++i)
if(p[1][i].y-p[1][nowQ].y>EPS)
nowQ=i;
double ans=1000000000000000007.0;
for(int i=0;i<n;++i)
{
while(Cross(p[1][(nowQ+1)%m]-p[1][nowQ],p[0][nowP]-p[0][(nowP+1)%n])>EPS)
nowQ=(nowQ+1)%m;
ans=min(ans,
min(calc(p[0][nowP],p[1][nowQ],p[1][(nowQ+1)%m]),
min(calc(p[0][(nowP+1)%n],p[1][nowQ],p[1][(nowQ+1)%m]),
min(calc(p[1][nowQ],p[0][nowP],p[0][(nowP+1)%n]),
calc(p[1][(nowQ+1)%m],p[0][nowP],p[0][(nowP+1)%n])))));
nowP=(nowP+1)%n;
}
printf("%.5lf\n",ans);
}
return 0;
}

【旋转卡壳】poj3608 Bridge Across Islands的更多相关文章

  1. poj3608 Bridge Across Islands

    地址:http://poj.org/problem?id=3608 题目: Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536 ...

  2. 「POJ-3608」Bridge Across Islands (旋转卡壳--求两凸包距离)

    题目链接 POJ-3608 Bridge Across Islands 题意 依次按逆时针方向给出凸包,在两个凸包小岛之间造桥,求最小距离. 题解 旋转卡壳的应用之一:求两凸包的最近距离. 找到凸包 ...

  3. POJ 3608 Bridge Across Islands(计算几何の旋转卡壳)

    Description Thousands of thousands years ago there was a small kingdom located in the middle of the ...

  4. POJ 3608 Bridge Across Islands(旋转卡壳,两凸包最短距离)

    Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7202   Accepted:  ...

  5. POJ 3608 Bridge Across Islands --凸包间距离,旋转卡壳

    题意: 给你两个凸包,求其最短距离. 解法: POJ 我真的是弄不懂了,也不说一声点就是按顺时针给出的,不用调整点顺序. 还是说数据水了,没出乱给点或给逆时针点的数据呢..我直接默认顺时针给的点居然A ...

  6. POJ - 3608 Bridge Across Islands【旋转卡壳】及一些有趣现象

    给两个凸包,求这两个凸包间最短距离 旋转卡壳的基础题 因为是初学旋转卡壳,所以找了别人的代码进行观摩..然而发现很有意思的现象 比如说这个代码(只截取了关键部分) double solve(Point ...

  7. POJ 3608 Bridge Across Islands [旋转卡壳]

    Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10455   Accepted: ...

  8. POJ 3608 Bridge Across Islands (旋转卡壳)

    [题目链接] http://poj.org/problem?id=3608 [题目大意] 求出两个凸包之间的最短距离 [题解] 我们先找到一个凸包的上顶点和一个凸包的下定点,以这两个点为起点向下一个点 ...

  9. Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离

    \(\color{#0066ff}{题目描述}\) 几千年前,有一个小王国位于太平洋的中部.王国的领土由两个分离的岛屿组成.由于洋流的冲击,两个岛屿的形状都变成了凸多边形.王国的国王想建立一座桥来连接 ...

随机推荐

  1. poj 1523 割点 tarjan

    Description Consider the two networks shown below. Assuming that data moves around these networks on ...

  2. POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)

    The Maximum Number of Strong Kings Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2488 ...

  3. 利用WebStorm来管理你的Github

    什么是Github Github是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目,以最简单的方式来说,其实就是一个代码库,上面有全世界无数优秀的码农上传自己的作品和大家共享(当然 ...

  4. 获取html元素内容

    html: <!DOCTYPE ><html> <head> <meta http-equiv="Content-Type" conten ...

  5. Vue项目中引入外部文件(css、js、less)

    例子中css文件采用bootstrap.css,js文件采用jQuery,less文件用less.less(自定义文件) 步骤一:安装webpack cnpm install webpack -g 步 ...

  6. uva 11427

    题目大意:每天晚上你都玩纸牌,如果第一次赢了就高高兴兴地去睡觉:如果输了就接着玩,假设每盘游戏获胜的的概率都是p,且各盘游戏相互独立.你是一个固执的完美主义者,因此会一直玩到当晚获胜局数的比例严格大于 ...

  7. [51nod1009]数字1的数量

    解题关键:数位dp,对每一位进行考虑,通过过程得出每一位上1出现的次数 1位数的情况: 在解法二中已经分析过,大于等于1的时候,有1个,小于1就没有. 2位数的情况: N=13,个位数出现的1的次数为 ...

  8. 前端导出文件功能document.execCommand命令

    参照 http://blog.csdn.net/woshinia/article/details/18664903

  9. #学习方法2打印为空,说明#延迟加载#解决方案:将nameField等设置改在viewDidLoad中设置

    #学习方法#error调试#NSLog调试之无法进行数据传输,Edit无法现实之前编辑 的内容             https://www.evernote.com/shard/s227/sh/c ...

  10. 通过jQuery实现轮播效果

    HTML <div class="wrap"> <div id="slide"> <ul class="list&quo ...