已知平面上若干个点的坐标。
需要求出在所有的组合中,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
则程序应该输出:
需要求出在所有的组合中,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
/*app:组合问题
*
* @author:(hyman)XiongQuan
*
* 输入用例:
10,10
20,20
80,50
10,20
20,10 回车,然后再回车 Attention:两次回车,见题目要求
*
*
* 整体思路:
* 1.从N个点中取出任意4个点
*
* 2.计算取出点的距离
*
* 3.得到最小距离即可
*/
static String[] Points;
static List<String> list=new ArrayList<String>();
static boolean[] vis;
static String[] parr=new String[4];
static double min = Double.MAX_VALUE;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//输入数据
String string="";
//long start=System.currentTimeMillis();
while(!(string=scanner.nextLine()).isEmpty())
{
list.add(string);
string="";
}
//将list每一项放入Points中
Points=new String[list.size()];
for(int i=0;i<list.size();i++)
{
Points[i] = list.get(i);
//System.out.println(list.get(i));
}
vis = new boolean[Points.length];
zuhe(0, 0);
//输出 保留小数点后两位
System.out.printf("%.2f",min);
/*long end=System.currentTimeMillis();
System.out.println();
System.out.println(end-start);*/
}
static void zuhe(int p,int j)
{
if(p==4)
{
//"find"
double tmp=cal_1(parr[0], parr[1], parr[2], parr[3]);
if(tmp<min)
{
min = tmp;
}
/*for(int i=0;i<parr.length;i++)
{
System.out.print(parr[i]+" ");
}
System.out.println();*/
}
else
{
for(;j<vis.length;j++)
{
if(vis[j]) continue;
parr[p] = Points[j];
vis[j]=true;
zuhe(p+1, j);
vis[j]=false;
}
}
}
static double cal_1(String a,String b,String c,String d)
{
String[] sarr=a.split(",");
int ax=Integer.parseInt(sarr[0]);
int ay=Integer.parseInt(sarr[1]);
sarr=b.split(",");
int bx=Integer.parseInt(sarr[0]);
int by=Integer.parseInt(sarr[1]);
sarr=c.split(",");
int cx=Integer.parseInt(sarr[0]);
int cy=Integer.parseInt(sarr[1]);
sarr=d.split(",");
int dx=Integer.parseInt(sarr[0]);
int dy=Integer.parseInt(sarr[1]);
double ab, ac, ad, bc, bd, cd;
ab=distance_1(ax,ay,bx,by);
ac=distance_1(ax,ay,cx,cy);
ad=distance_1(ax,ay,dx,dy);
bc=distance_1(cx,cy,bx,by);
bd=distance_1(dx,dy,bx,by);
cd=distance_1(cx,cy,dx,dy);
return (ab+ ac+ ad+bc+ bd+ cd)/6;
}
static double distance_1(int ax,int ay,int bx,int by)
{
return Math.sqrt((ax-bx)*(ax-bx)+
(ay-by)*(ay-by));
}