最近点对问题 ---递归,分治
来源:互联网 发布:mac win8.1 iso 下载 编辑:程序博客网 时间:2024/04/29 07:04
问题描述:
在二维平面上的n个点中,找出最近的一对点,就是最近点对问题。
代码如下:
#include <iostream>#include <math.h>#include <algorithm>using namespace std;/*--------------顶点坐标*/typedef struct Point{ double x , y;};/*--------------操作顶点坐标*/typedef struct TPoint{ int index; double x , y;};double d = 10e6; //----初始化距离/*--------------按x排序*/int cmpX(Point a , Point b){ return a.x < b.x;}/*-------------按y排序*/int cmpY(TPoint a , TPoint b){ return a.y < b.y;}/*-----------计算两个顶点的距离*/double distance(double ax , double ay , double bx , double by){ double abx = ax - bx, aby = ay - by; return sqrt(abx*abx+aby*aby);}/*-----------求解最短距离的工作过程函数*/void closest(Point x[] , TPoint *y , int l , int r){ double dl , dr , dm; if(r-l == 1){ //-----------只有2个顶点 d = min(d , distance(x[l].x , x[l].y , x[r].x , x[r].y )); return; } if(r-l == 2){ //-----------只有3个顶点 d = min(d , distance(x[l].x , x[l].y , x[r].x , x[r].y )); d = min(d , distance(x[l].x , x[l].y , x[l+1].x , x[l+1].y )); d = min(d , distance(x[l+1].x , x[l+1].y , x[r].x , x[r].y )); return; } /*----------多于3个顶点*/ TPoint *sl = new TPoint[(r-l)/2+6]; TPoint *sr = new TPoint[(r-l)/2+6]; int m = (r-l)/2+l;//------------从中间分开 int j = 0 , k = 0; for(int i = 0 ; i <= r-l ; i++){ if(y[i].index <= m) sl[j++] =y[i];//----<=m 放左边 else sr[k++] = y[i]; //--->m 放右边 } closest(x , sl , l , m);//递归求解左边 closest(x , sr , m+1 , r);//递归求解右边 Point *z = new Point[r-l+6]; k = 0; /*-------------找出 距离 m < d 的说有顶点*/ for(int i = 0 ; i <= r-l ; i++){ if(fabs(x[m].x-y[i].x) < d){ z[k].x = y[i].x; z[k++].y = y[i].y; } } /*-----------------顶点最短距离位于左右两边*/ for(int i = 0 ; i < k ; i++){ for(j = i+1 ; (j < k) && (z[j].y-z[i].y) < d ; j++){ d = min(d , distance(z[i].x , z[i].y , z[j].x , z[j].y)); } } delete sl; delete sr; delete z;}/*-------初始化函数*/bool Cpair(Point x[] , int n){ if(n < 2) return false; sort(x , x+n , cmpX);//----按 x排序 TPoint *y = new TPoint[n+6]; for(int i = 0 ; i < n ; i++){//-----复制 y[i].index =i; y[i].x = x[i].x; y[i].y = x[i].y; } sort(y , y+n , cmpY);//---按 y排序 closest(x , y , 0 , n-1); delete y; return true;}/*--------main()*/int main(){ int n; cout<<"请输入顶点数:"<<endl; cin>>n; Point x[n]; cout<<"请输入"<<n<<"个顶点坐标:"<<endl; for(int i = 0 ; i < n ; i++) cin>>x[i].x>>x[i].y; Cpair(x , n); cout<<"最短距离是:"<<d<<endl; return 0;}/*请输入顶点数:5请输入5个顶点坐标:1 23 47 943 7856 78最短距离是:2.82843Process returned 0 (0x0) execution time : 11.575 sPress any key to continue.*/
0 0
- 最近点对问题 ---递归,分治
- 分治策略 求 最近点对问题
- 分治法求最近点对问题
- 分治法:平面最近点对问题
- 分治法最近点对问题
- 分治法求最近点对问题
- 最近点对问题(分治)
- zoj2107 最近点对问题 分治思想
- 最近点对问题(分治)
- 分治策略之最近点对问题
- 最近点对问题——分治
- 分治法求解最近点对问题
- 最近点对 (分治)
- 最近点对(分治)
- 找最近点对问题-分治算法的应用
- 最近点对问题的分治算法分析与实现
- 找最近点对问题-分治算法的应用
- 最近点对问题(分治思想的经典应用)
- 连续执行 Shell 命令
- yii 公共页面部分
- mybatis 传递多参数(不使用实体)
- IOS-NSNotification的简单使用流程:
- js验证字符串长度 是否区分中文
- 最近点对问题 ---递归,分治
- Qt和c/c++connect函数冲突解决方法
- 程序员每天该做的事
- 黑马程序员——java基础——异常(此乃java中的一个重点)
- Java equals和hashCode
- 支付宝跳转
- C++list、vector、map区别与用法
- 23种设计模式(6):模版方法模式
- 解决npm下载慢的问题,cnpm加速npm下载速度