现在的位置: 首页 > 综合 > 正文

四点求距离最小

2019年06月08日 ⁄ 综合 ⁄ 共 2311字 ⁄ 字号 评论关闭

已知平面上若干个点的坐标。

需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。

比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd 这6个距离的平均值。

每个点的坐标表示为:横坐标,纵坐标

坐标的取值范围是:1~1000

例如,如果程序输入:
10,10
20,20
80,50
10,20
20,10

则程序应该输出:
11.38

#include <iostream>  
#include <fstream>  
#include <vector>  
#include <cmath>  
#include <iomanip>  
#include <algorithm>  

using namespace std;  

struct Point  
{  
	int x,y;  
	int x2y2;  
	Point()  
	{  
		return;  
	}  
	Point(int t_x,int t_y)  
		:x(t_x),  
		y(t_y)  
	{  
		x2y2 = t_x * t_x + t_y * t_y;  
	}  
	const Point& operator=(const Point& point)  
	{  
		x = point.x;  
		y = point.y;  
		x2y2 = point.x2y2;  

		return *this;  
	}  
};  

bool operator<(const Point& left,const Point& right)  
{  
	if (left.x2y2 < right.x2y2)  
	{  
		return true;  
	}  
	return false;  
}  
bool operator==(const Point& left,const Point& right)  
{  
	if (left.x2y2 == right.x2y2)  
	{  
		return true;  
	}  
	return false;  
}  
typedef vector<Point> PointArray;  

static double min_sum = 0x3f3f3f3f;  
static int ps[4];  

inline int get_dis_no_sqrt(PointArray& points,int x,int y)  
{  
	int off_x = 0;  
	int off_y = 0;  

	off_x = points[x].x - points[y].x;  
	off_y = points[x].y - points[y].y;  

	off_x = off_x * off_x;  
	off_y = off_y * off_y;  
	return off_x + off_y;  
}  
inline void my_sort(PointArray& points)  
{  
	int s = points.size();  

	for (int i = 0;i < s;i++)  
	{  
		int min_x_y = 0x3f3f3f3f;  

		/*对所有的进行重排*/  
		for (int j = i + 1;j < s;j++)  
		{  
			if (points[j].x - points[i].x > min_x_y || points[j].y - points[i].y > min_x_y)  
			{  
				break;  
			}  
			int dis_i_i_1 = get_dis_no_sqrt(points,i,i + 1);  
			int dis_i_j = get_dis_no_sqrt(points,i,j);  

			if (dis_i_i_1 < dis_i_j)  
			{  
				continue;  
			}  
			/*向后移动*/  
			Point p = points[j];  
			for (int k = j;k > i + 1;k--)  
			{  
				points[k] = points[k - 1];  
			}  
			points[i + 1] = p;  
			min_x_y = (int)sqrt(dis_i_j * 1.0) + 1;  

		}  
	}  
	return;  
}  

inline double get_dis(PointArray& points,int x,int y)  
{  
	return sqrt(double(get_dis_no_sqrt(points,x,y)));  
}  
void search(PointArray& points,int p4[],int off,int lev)  
{  
	if (lev == 4)  
	{  
		double sum = 0;  

		for (int i = 0;i < 3;i++)  
		{  
			sum += get_dis(points,p4[i],p4[i + 1]);  
		}  
		sum += get_dis(points,p4[0],p4[2]);  
		sum += get_dis(points,p4[0],p4[3]);  
		sum += get_dis(points,p4[1],p4[3]);  
		if (min_sum > sum)  
		{  
			min_sum = sum;  
			for (int i = 0;i < 4;i++)  
			{  
				ps[i] = p4[i];  
			}  
		}  
		return;  
	}  
	for (int i = off;i < points.size();i++)  
	{  
		if (get_dis(points,i,p4[0]) > min_sum)  
		{  
			break;  
		}  
		p4[lev] = i;  
		search(points,p4,i + 1,lev + 1);  
	}  
	return;  
}  
int main()  
{  
	fstream fst("in.txt",ios::in);  
	int x,y;  
	char ch;  

	PointArray points;  

	while (fst >> x >> ch >> y)  
	{  
		Point p(x,y);  
		points.push_back(p);  
	}  

	sort(points.begin(),points.end());  
	my_sort(points);  
	int s = points.size();  
	if (s < 4)  
	{  
		cout << "0.00" << endl;  
	}  
	else  
	{  
		int p4[4] = {0};  

		for (int i = 0;i < s - 4;i++)  
		{  
			memset(p4,0,sizeof(p4));  
			p4[0] = i;  
			search(points,p4,i,0);  
		}  

		cout << fixed << setprecision(2) << min_sum / 6 << endl;  
		cout << endl;  
	}  
	return 0;  
}  

抱歉!评论已关闭.