最近点对问题 ---递归,分治

来源:互联网 发布: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