最近对问题## 标题
在n个点中,距离最近的两个点,在二维坐标平面中,两点分别是a(x1,y1),b(x2,y2),则两点距离是
d=sqrt((x1-x2)2+(y1-y2)2)
蛮力法,将平面内的n个点,两两组队,计算最小距离,注意,这儿没有方向,也就是说两点之间只需要求解一次就行了,而且考虑的是距离所以可以简化公式,不用开方,直接计算平方就行了。
其中注意,ind1和ind2这个引用类型,return返回只能返回一个,所以用引用类型变量。
close.txt
15
5 10
9 1
10 12
10 19
13 15
15 19
16 20
19 9
24 0
24 12
31 32
32 24
38 29
40 56
45 23
完整代码:(c++)
```cpp
#include<iostream>
#include<math.h>
#include<time.h>
#include<fstream>
using namespace std;
#define MAX 0x3f3f3f3f //定义无穷大
#define M 100
typedef struct Point
{
int x;
int y;
}P[M];
float ClosePoint(P p,int n,int &ind1,int &ind2)
{
int dmin=MAX,d;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
d=(p[i].x - p[j].x)*(p[i].x - p[j].x) + (p[i].y - p[j].y)*(p[i].y - p[j].y);
if(d<dmin)
{
dmin=d;
ind1=i;
ind2=j;
}
}
}
return dmin;
}
int main()
{
clock_t start;
double totaltime;
start=clock();
int ind1,ind2,n;
P p;
float dmin;
ifstream read_in;
read_in.open("close.txt");
read_in >> n;
cout<<"读入点数为:"<<n<<endl;
cout<<"点的坐标为:"<<endl;
for(int i=0;i<n;i++)
{
cout<<"p"<<i+1<<":";
read_in>>p[i].x>>p[i].y;
cout<<p[i].x<<" "<<p[i].y<<endl;
}
dmin=sqrt(ClosePoint(p,n,ind1,ind2));
cout<<"最近的两个点是:"<<"p"<<ind1+1<<" "<<"p"<<ind2+1<<endl;
cout<<"最近的距离是:"<<dmin<<endl;
clock_t end=clock();
totaltime=(double)(end-start)/CLOCKS_PER_SEC;
cout<<"程序运行时间是:"<<totaltime<<endl;
return 0;
}
运行结果:
原文链接:
https://blog.csdn.net/qq_40452317/article/details/88040973