已知平面上若干个点的坐标。
需要求出在所有的组合中,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;
}