YTU OJ-1324: 平面4点最小距离

1324: 平面4点最小距离

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 21   Solved: 6
[ Submit][ Status][ Web Board]

Description


已知平面上若干个点的坐标。

需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。

比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd 这6个距离的平均值。

每个点的坐标表示为:横坐标,纵坐标

坐标的取值范围是:1~1000

Input

Output

Sample Input

10,10
20,20
80,50
10,20
20,10

Sample Output

11.38

绞尽脑汁也没有想到怎样输入若干点坐标,连输入结束的判断条件都没有啊......

难道这个题目是要求输入一组数据就计算一次?这不科学啊....望各位大佬解惑

以下奉上我写的只能计算一次的代码,就是深搜加距离的计算

import java.util.*;
public class 平面4点最小距离 {
	static List<Character> lis=new ArrayList<Character>();
	static List<String> set=new ArrayList<String>();
	static int[][] a=new int[100][2];
	static int[] b=new int[6];
	static int m=0,n=0;
	//深搜
	public static void dfs(int s,int n,int[] b) {
		if(s==4) {
			StringBuffer st=new StringBuffer("");
			st.append(lis.get(b[0]));
			st.append(lis.get(b[1]));
			st.append(lis.get(b[2]));
			st.append(lis.get(b[3]));
			if(!set.contains(st.toString()))
				set.add(st.toString());
			return;
		}else {
			for(int i=n+1;i<lis.size();i++) {
				b[s]=i;
				dfs(s+1,i,b);
			}
		}
	}
 	//找到四个不重复的点
	public static void getR(int k) {
		char[] c=new char[k];
		for(int i=0;i<k;i++) {
			c[i]=(char)(i+48);
		}
		for(int i=0;i<c.length;i++) {
			if(!lis.contains(c[i]))
				lis.add(c[i]);
		}
		Collections.sort(lis);
		int[] b=new int[k];
		dfs(0,-1,b);
		for(int i=0;i<set.size();i++) {
			for(int j=0;j<set.get(i).length();j++)
				Integer.parseInt(set.get(i).charAt(j)+"");
		}
	}
	//计算四个点的平均距离
	public static double sumL(int i) {
		double sum=0;
		int a1=Math.abs(a[Integer.parseInt(set.get(i).charAt(0)+"")][0]-a[Integer.parseInt(set.get(i).charAt(1)+"")][0]);
		int a2=Math.abs(a[Integer.parseInt(set.get(i).charAt(0)+"")][1]-a[Integer.parseInt(set.get(i).charAt(1)+"")][1]);
		double a3=Math.sqrt(a1*a1+a2*a2);
		int b1=Math.abs(a[Integer.parseInt(set.get(i).charAt(0)+"")][0]-a[Integer.parseInt(set.get(i).charAt(2)+"")][0]);
		int b2=Math.abs(a[Integer.parseInt(set.get(i).charAt(0)+"")][1]-a[Integer.parseInt(set.get(i).charAt(2)+"")][1]);
		double b3=Math.sqrt(b1*b1+b2*b2);
		int c1=Math.abs(a[Integer.parseInt(set.get(i).charAt(0)+"")][0]-a[Integer.parseInt(set.get(i).charAt(3)+"")][0]);
		int c2=Math.abs(a[Integer.parseInt(set.get(i).charAt(0)+"")][1]-a[Integer.parseInt(set.get(i).charAt(3)+"")][1]);
		double c3=Math.sqrt(c1*c1+c2*c2);
		int d1=Math.abs(a[Integer.parseInt(set.get(i).charAt(1)+"")][0]-a[Integer.parseInt(set.get(i).charAt(2)+"")][0]);
		int d2=Math.abs(a[Integer.parseInt(set.get(i).charAt(1)+"")][1]-a[Integer.parseInt(set.get(i).charAt(2)+"")][1]);
		double d3=Math.sqrt(d1*d1+d2*d2);
		int e1=Math.abs(a[Integer.parseInt(set.get(i).charAt(1)+"")][0]-a[Integer.parseInt(set.get(i).charAt(2)+"")][0]);
		int e2=Math.abs(a[Integer.parseInt(set.get(i).charAt(1)+"")][1]-a[Integer.parseInt(set.get(i).charAt(2)+"")][1]);
		double e3=Math.sqrt(e1*e1+e2*e2);
		int f1=Math.abs(a[Integer.parseInt(set.get(i).charAt(2)+"")][0]-a[Integer.parseInt(set.get(i).charAt(3)+"")][0]);
		int f2=Math.abs(a[Integer.parseInt(set.get(i).charAt(2)+"")][1]-a[Integer.parseInt(set.get(i).charAt(3)+"")][1]);
		double f3=Math.sqrt(f1*f1+f2*f2);
        sum=(a3+b3+c3+d3+e3+f3)/6;
        return sum;
		
	}
	public static void main(String[] args) throws Exception {
		Scanner in=new Scanner(System.in);
		double min=10000000;
        for(int i=0;i<5;i++) {
        	String s = in.nextLine();
            String[] temp = s.split(",");
            a[i][0]= Integer.parseInt(temp[0]);
            a[i][1]= Integer.parseInt(temp[1]);
        }
        getR(5);
		for(int i=0;i<set.size();i++)
			if(min>sumL(i)) {
				min=sumL(i);
			}
		System.out.printf("%.2f",min);
	}
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值