POJ3608
计算两个凸包之间的最小距离,旋转卡壳法详解在旋转卡壳的用法之计算两个凸 包上的最近距离
#include <iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
using namespace std;
const double eps=1e-10;
const double INF=1e10;
struct point
{
double x,y;
point (double a=0,double b=0)
{
x=a;
y=b;
}
};
double min_val(double a,double b)
{
return a>b?b:a;
}
int dcmp(double a)
{
if(fabs(a)<eps)return 0;
else return a>0?1:-1;
}
point operator -(point a,point b){ return point (a.x-b.x,a.y-b.y); }
bool operator ==(const point &a,const point &b)
{
return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
}
double cross(point a,point b)
{
return a.x*b.y-a.y*b.x;
}
void readdate(point a[],int n,point b[],int m)
{
int i;
for(i=0;i<n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
for(i=0;i<m;i++)
scanf("%lf%lf",&b[i].x,&b[i].y);
}
void change(point a[],int b)
{
int i;
point temp;
for(i=0;i<b/2;i++)
{
temp=a[i];
a[i]=a[b-1-i];
a[b-1-i]=temp;
}
}
void work(point p[],int n,point q[],int m)
{
int i;
for(i=0;i<n-2;i++)
if(dcmp(cross(p[i+1]-p[i],p[i+2]-p[i])>0)) break;
else if(dcmp(cross(p[i+1]-p[i],p[i+2]-p[i])<0))
{
change(p,n);
break;
}
for(i=0;i<m-2;i++)
if(dcmp(cross(q[i+1]-q[i],q[i+2]-q[i])>0))break;
else if(dcmp(cross(q[i+1]-q[i],q[i+2]-q[i])<0))
{
change(q,m);
break;
}
}
double Dot(point A,point B){return A.x*B.x+A.y*B.y;}
double Length(point A){return sqrt(Dot(A,A));}
double dist(point a,point b,point p)
{
if(a==b) return Length(p-a);
point v1=b-a,v2=p-a,v3=p-b;
if(dcmp(Dot(v1,v2))<0)return Length(v2);
if(dcmp(Dot(v1,v3))>0)return Length(v3);
return fabs(cross(v1,v2))/Length(v1); }
double Mid(point a1,point a2,point b1,point b2)
{
return min_val(min_val(dist(a1,a2,b1),dist(a1,a2,b2)),
min_val(dist(b1,b2,a1),dist(b1,b2,a2)));
}
double solve(point P[],int n,point Q[],int m)
{
double ans=INF,temp;
int i,minP=0,maxQ=0;
for(i=0;i<n;i++)
if(P[i].y<P[minP].y)
minP=i;
for(i=0;i<m;i++)
if(Q[i].y>Q[maxQ].y)
maxQ=i;
Q[m]=Q[0];
P[n]=P[0];
for(i=0;i<n;i++)
{
while((temp=cross(Q[maxQ+1]-P[minP+1],P[minP]-P[minP+1])
-cross(Q[maxQ]-P[minP+1],P[minP]-P[minP+1]))>eps)
maxQ=(maxQ+1)%m;
if(temp<-eps)
ans=min_val(ans,dist(P[minP],P[minP+1],Q[maxQ]));
else ans=min_val(ans,Mid(P[minP],P[minP+1],Q[maxQ],Q[maxQ+1]));
minP=(minP+1)%n;
}
return ans;
}
int main()
{
point p[10005],q[10005];
int n,m;
double a,b;
while(scanf("%d%d",&n,&m)==2)
{
if(m==0&&n==0)break;
readdate(p,n,q,m);
work(p,n,q,m);
a=solve(p,n,q,m);
b=solve(q,m,p,n);
printf("%.5lf\n",min_val(a,b));
}
return 0;
}
POJ3608的更多相关文章
- 【poj3608】 Bridge Across Islands
http://poj.org/problem?id=3608 (题目链接) 题意 求两凸包间最短距离 Solution 难写难调,旋转卡壳,还真是卡死我了. 先分别选出两凸包最上点和最下点,从这两点开 ...
- 「POJ-3608」Bridge Across Islands (旋转卡壳--求两凸包距离)
题目链接 POJ-3608 Bridge Across Islands 题意 依次按逆时针方向给出凸包,在两个凸包小岛之间造桥,求最小距离. 题解 旋转卡壳的应用之一:求两凸包的最近距离. 找到凸包 ...
- POJ3608(旋转卡壳--求两凸包的最近点对距离)
题目:Bridge Across Islands 分析:以下内容来自:http://blog.csdn.net/acmaker/article/details/3178696 考虑如下的算法, 算法的 ...
- poj3608 Bridge Across Islands
地址:http://poj.org/problem?id=3608 题目: Bridge Across Islands Time Limit: 1000MS Memory Limit: 65536 ...
- 【旋转卡壳】poj3608 Bridge Across Islands
给你俩凸包,问你它们的最短距离. 咋做就不讲了,经典题,网上一片题解. 把凸包上的点逆时针排序.可以取它们的平均点,然后作极角排序. 旋转卡壳其实是个很模板化的东西…… 先初始化分别在凸包P和Q上取哪 ...
- 旋转卡壳求两个凸包最近距离poj3608
#include <iostream> #include <cmath> #include <vector> #include <string.h> # ...
随机推荐
- netstat命令的安装
yum -y install net-tools (可以生成ifconfig命令,netstat命令)
- matlab中 数据保留有效位数
可以使用round函数 ,这函数原本功能是四舍五入 比如: >> A = 0.0326465;>> B = round(A*1000)/1000 B = 0.0330
- DXP 内电层分割
多层电路板中间层设置与内电层如何分割 多层电路板与一般的电路板不同之处在于,多层电路板除了顶层和底层之外,还有若干中间层,这些中间层可以是信号层(mid layer),也可以是内部电源/接地层(int ...
- javaAgent 参数
-javaagent 这个JVM参数是JDK 5引进的. Java -help的帮助里面写道: -javaagent:<jarpath>[=<options>] load Ja ...
- 使用iLO远程管理HP系列服务器
iLO是Integrated Ligths-out的简称,是HP服务器上集成的远程管理端口,它是一组芯片内部集成vxworks嵌入式操作系统,通过一个标准RJ45接口连接到工作环境的交换机.只要将服务 ...
- position fixed 居中
1.水平居中.footer { height: 10%; text-align: center; position: relative; left: 50%; transform: translate ...
- iOS - ShareSDK第三方分享(图文和视频)和登录
由于近期工作需要自己抽时间搞了一下第三方分享,这里使用的是shareSDK的第三方,在使用的过程中有一些心得和体会,特在此和大家分享一下~ 1.在经过将近一周时间的开发,终于搞定ios分享了. 2.由 ...
- tomcat+redis会话共享
1.基础环境: jdk1. tomcat7 redis nginx 2.添加依赖的jar包到tomcat的lib目录(http://pan.baidu.com/s/1eRAwN0Q) 3.配置tomc ...
- Hive desc
Describe Database hive> DESCRIBE DATABASE test; test ??? hdfs://ns1/user/hive/warehouse/test.db w ...
- Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(转)
通过前面的学习,你可能大致了解了Quartz,本篇博文为你打开学习SSMM+Quartz的旅程!欢迎上车,开始美好的旅程! 本篇是在SSM框架基础上进行的. 参考文章: 1.Quartz学习——Qua ...