备考蓝桥杯(36)平均距离最小的4个点(超级经典exeforward案例)

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();
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值