1324: 平面4点最小距离
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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);
}
}