⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 closest.cpp

📁 常用算法与数据结构原代码
💻 CPP
字号:
// closest pair of points

#include <iostream.h>
#include <math.h>
#include "msort.h"
#include "point.h"

template<class T>
inline float dist(const T& u, const T& v)
{// Distance between points u and v.
	float dx = u.x - v.x;
	float dy = u.y - v.y;
	return sqrt(dx * dx + dy * dy);
}

void close(Point1 X[], Point2 Y[], Point2 Z[],
		   int l, int r, Point1& a, Point1& b, float& d)
{// X[l:r] is sorted by x-coordinate.
	// Y[l:r] is sorted by y-coordinate.
	if (r-l == 1) 
	{// two points
		a = X[l];
		b = X[r];
		d = dist(X[l], X[r]);
		return;
	}
	
	if (r-l == 2) 
	{// three points
		// compute distance between all pairs
		float d1 = dist(X[l], X[l+1]);
		float d2 = dist(X[l+1], X[r]);
		float d3 = dist(X[l], X[r]);
		// find closest pair
		if (d1 <= d2 && d1 <= d3) 
		{
			a = X[l];
			b = X[l+1];
			d = d1;
			return;
		}
		if (d2 <= d3)
		{
			a = X[l+1];
			b = X[r];
			d = d2;
		}
		else
		{
			a = X[l];
			b = X[r];
			d = d3;
		}
		return;
	}
	
	// more than 3 points, divide into two
	int m = (l+r)/2;    // X[l:m] in A, rest in B
	
	// create sorted by y lists in Z[l:m] & Z[m+1:r]
	int f = l,    // cursor for Z[l:m]
		g = m+1;  // cursor for Z[m+1:r]
	for (int i = l; i <= r; i++)
		if (Y[i].p > m) 
			Z[g++] = Y[i];
		else 
			Z[f++] = Y[i];
		
		// solve the two parts
		close(X,Z,Y,l,m,a,b,d);
		float dr;
		Point1 ar, br;
		close(X,Z,Y,m+1,r,ar,br,dr);
		
		// make (a,b) closer pair of the two
		if (dr < d) 
		{
			a = ar;
			b = br;
			d = dr;
		}
		
		Merge(Z,Y,l,m,r);// reconstruct Y
		
		// put points within d of mid point in Z
		int k = l;  // cursor for Z
		for (i = l; i <= r; i++)
			if (fabs(Y[m].x - Y[i].x) < d) 
				Z[k++] = Y[i];
			
			// search for closer category 3 pair
			// by checking all pairs from Z[l:k-1]
			for (i = l; i < k; i++)
			{
				for (int j = i+1; j < k && Z[j].y - Z[i].y < d; j++)
				{
					float dp = dist(Z[i], Z[j]);
					if (dp < d) 
					{// closer pair
						d = dp;
						a = X[Z[i].p];
						b = X[Z[j].p];
					}
				}
			}
}

bool closest(Point1 X[], int n, Point1& a,
			 Point1& b, float& d)
{// Find closest pair from n >= 2 points.
	// Return false if fewer than two points.
	// Otherwise, return closest points in a and b.
	if (n < 2) return false;
	
	// sort on x-coordinate
	MergeSort(X,n);
	
	// create a point array sorted on y-coordinate
	Point2 *Y = new Point2 [n];
	for (int i = 0; i < n; i++) 
	{
		// copy point i from X to Y and index it
		Y[i].p = i;
		Y[i].x = X[i].x;
		Y[i].y = X[i].y;
	}
	MergeSort(Y,n);  // sort on y-coordinate
	
	// create temporary array needed by close
	Point2 *Z = new Point2 [n];
	
	// find closest pair
	close(X,Y,Z,0,n-1,a,b,d);
	
	// delete arrays and return
	delete [] Y;
	delete [] Z;
	return true;
}

void main()
{
	Point1 X[100], a, b;
	int n;
	float d;
	cout << "Enter number of points" << endl;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cout << "Enter point " << (i + 1) << endl;
		cin >> X[i].x >> X[i].y;
		X[i].ID = i + 1;
	}
	cout << "Return status is " << closest(X, n, a, b, d) << endl;
	cout << "Closest points are " << a.ID << " and " << b.ID << endl;
	cout << "Their distance is " << d << endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -