用分治算法解平面最接近点对问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一. 用分治算法解平面最接近点对问题

1.题目

关于最接近点对问题:

给定平面上n个点,找出其中一对点,使得在n个点所构成的所有点对中,该点对的距离最小。

2.程序详细介绍(各模块的功能等)

本程序主要包括两个类:类Point和类Ppoint.其中类Point为处理一些的基本数据传递等.类Ppoint为该程序的主要实现模块,该类中有输入点对的函数shuru,对所输入的点对按X轴排序的函数sort,求各点对的距离的函数xiao等.

假设S中的点为平面上的点,它们都有2个坐标值x和y。为了将平面上点集S线性分割为大小大致相等的2个子集S1和S2,我们选取一垂直线l(方程:x=m)来作为分割直线。其中m为S中各点x坐标的中位数。由此将S分割为S1={p∈S|px≤m}和S2={p∈S|px>m}。从而使S1和S2分别位于直线l的左侧和右侧,且S=S1∪S2 。由于m是S中各点x坐标值的中位数,因此S1和S2中的点数大致相等。递归地在S1和S2上解最接近点对问题,我们分别得到S1和S2中的最小距离δ1和δ2.此即为该程序的大致算法.

3. 程序结构(流程图)

该程序的流程图如下所示

4. 调试与测试:调试方法,测试结果(包括输入数据和输出结果)的分析与讨论

运行该程序时,屏幕上会出现一个界面,首先该界面会提示输入要处理的点对个数,输入点对个数后从键盘输入数字0即可显示出处理后的各个结果,会出现如下结果:

5.程序代码(源程序)

#include

#include

#include

using namespace std;

int i,j,k,d,m,n;

double p2,q,s,r,t;

class Point //创建一个点类//

{

public:

double x;

double y;

double getx()

{

return x;

}

double gety()

{

return y;

}

friend class Ppoint;

};

class Ppoint

{

int sum;

double juli[10][10];

double min[11]; //min[10]用来存放每组中最短的距离//

double mini[11]; //mini[10]用来存放每组中距离最短的点对中的第一个点//

double minj[11]; //minj[10]用来存放每组中距离最短的点对中的第二个点//

Point p[100];

Point p1;

public:

void shuru()

{

cout<<"请输入要处理的点的个数"<

cin>>sum;

for(i=0;i

{

cout<<"请输入点对"<

cin>>p[i].x;

cin>>p[i].y;

cout<

}

}

void sort()

{

cout<<"以下是按x轴上由小到大排序后的点对"<

for(i=0;i

{

for(j=i+1;j

{

if(p[i].x>p[j].x)

{

p1=p[i];

p[i]=p[j];

p[j]=p1;

}

}

}

for(i=0;i

{

cout<

}

}

void xiao()

{

cout<<"以下是对每个模块中的点求距离"<

for(k=0;k

{

cout<<"按任意键继续"<

cin>>i;

cout<<"以下是第"<

for(i=1;i<10;i++)

{

for(j=0;j

{

r=abs(p[k*10+i].x-p[k*10+j].x);

t=abs(p[k*10+i].y-p[k*10+j].y);

juli[i][j]=sqrt(r*r+t*t);

cout<

}

cout<

}

min[k]=juli[k][0],mini[k]=10*k+1,minj[k]=10*k;

for(i=1;i<10;i++)

{

cout<<"\n"<<"第"<

for(j=0;j

{

if(juli[i][j]

{

min[k]=juli[i][j];

mini[k]=10*k+i;

minj[k]=10*k+j;

}

}

}

cout<<"\n"<<"这是第"<

cout<<"\n"<<"距离最小值为"<

cout<<"\n"<<"距离最小值的第一个点为"<

}

if(sum%10!=0)

{

k=sum/10;

cout<<"输入0显示结果"<

cin>>i;

for(i=1;i

{

for(j=0;j

{

m=abs(p[k*10+i].x-p[k*10+j].x);

n=abs(p[k*10+i].y-p[k*10+j].y);

juli[i][j]=sqrt(m*m+n*n);

cout<

cout<<"\t";

}

cout<

}

min[k]=juli[1][0],mini[k]=10*k+1,minj[k]=10*k;

for(i=1;i

{

cout<<"\n"<<"第"<

for(j=0;j

{

相关文档
最新文档