package pers.robert.lanqiaobeizhenti129;
import java.awt.Point;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;
/**
* 45.平面4点最小距离
已知平面上若干个点的坐标。
需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。
比如有4个点:a,b,c,d,则平均距离是指:ab, ac, ad, bc, bd, cd 这6个距离的平均值。
每个点的坐标表示为:横坐标,纵坐标
坐标的取值范围是:1~1000
所有点的坐标记录在in.txt中,请读入该文件,然后计算。
注意:我们测试您的程序的时候,in.txt 可能会很大,比如包含上万条记录。
举例:
如果,in.txt 内的值为:
10,10
20,20
80,50
10,20
20,10
则程序应该输出:
11.38
* @author Robert
*
*/
public class The045FourPointDistanceDemo1_question {
public static double exeForward(Vector<Point>vpoints,Vector<Point>tpoints,int index) {
// for (Point point : tpoints) {
// System.out.print("["+point.x+","+point.y+"]");
// }
// System.out.println();
if(tpoints.size()==4){//第二个参数的长度是4,也就是第二个参数放进去了4个点
double t=tpoints.get(0).distance(tpoints.get(1))+tpoints.get(0).distance(tpoints.get(2))+tpoints.get(0).distance(tpoints.get(3))
+tpoints.get(1).distance(tpoints.get(2))+tpoints.get(1).distance(tpoints.get(3))+tpoints.get(2).distance(tpoints.get(3));
t/=6;
//System.out.println(t);
return t;
}else if (index<vpoints.size()) {
Vector<Point>vector1=new Vector<Point>(tpoints);
Vector<Point>vector2=new Vector<Point>(tpoints);
vector2.add(vpoints.get(index));
//这里指的的vector1 没有放入第Index个点,vector2是放入 了第index个点的,这里就决定了每个点组合的顺序abcd的顺序
double min1=exeForward(vpoints, vector1, index+1);
double min2=exeForward(vpoints, vector2, index+1);
return Math.min(min1, min2);
}
return Double.MAX_VALUE;
}
public static void main(String[] args) {
try {
File file=new File("in.txt");
FileInputStream fileInputStream=new FileInputStream(file);
InputStreamReader inputStreamReader=new InputStreamReader(fileInputStream);
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
Vector<Point>vpoints=new Vector<Point>();
String ts;
while((ts=bufferedReader.readLine())!=null){
String tss[]=ts.split("\\,");
Point point=new Point(Integer.parseInt(tss[0]), Integer.parseInt(tss[1]));
vpoints.add(point);
}
Vector<Point> tpoints=new Vector<Point>();
System.out.println(String.format("%.2f", exeForward(vpoints, tpoints, 0)));
bufferedReader.close();
} catch (FileNotFoundException e) {
// TODO: handle exception
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
备考蓝桥杯(36)平均距离最小的4个点(超级经典exeforward案例)
最新推荐文章于 2019-03-16 22:06:37 发布