蓝桥杯——平面4点最小距离

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




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值