算法-蛮力法-最近对问题

最近对问题## 标题
在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值