云云豆酱 2023-03-06 19:58 采纳率: 100%
浏览 32
已结题

蓝桥杯 平面点集中4点最小平均距离

题目描述
已知平面上若干个点的坐标。

需要求出在所有的组合中,4 个点间平均距离的最小值(四舍五入,保留 2 位小数)。
比如有 4 个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd 这 6 个距离的平均值。

输入描述
输入多行(可能包含上万行),每行两个数字 x,y\ (1 \leq x,y \leq 1000)x,y (1≤x,y≤1000),表示每个点的坐标。

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

输入输出样例
示例
输入

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

输出

11.38

  • 写回答

2条回答 默认 最新

  • pzzhao 2023-03-06 20:20
    关注

    该回答引用自ChatGPT
    先贴本人本地执行结果

    img

    这个是我根据chatGPT代码修改的。

    最近感觉chatGPT给的代码经常有问题

    import java.util.*;
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            double min = Integer.MAX_VALUE;
            //先将点存储在Point数组里面
            ArrayList<Point> list = new ArrayList<>();
            String line = "";
            while (!("").equals(line=sc.nextLine())) {
                String[] s = line.split(",");
                list.add(new Point(Integer.parseInt(s[0]), Integer.parseInt(s[1])));
            }
            //穷举所有四个点的组合
            for (int i = 0; i < list.size(); i++) {
                for (int j = i + 1; j < list.size(); j++) {
                    for (int k = j + 1; k < list.size(); k++) {
                        for (int l = k + 1; l < list.size(); l++) {
                            double sum = 0;
                            //计算平均距离
                            sum += getDistance(list.get(i), list.get(j));
                            sum += getDistance(list.get(i), list.get(k));
                            sum += getDistance(list.get(i), list.get(l));
                            sum += getDistance(list.get(j), list.get(k));
                            sum += getDistance(list.get(j), list.get(l));
                            sum += getDistance(list.get(k), list.get(l));
                            sum /= 6;
                            if (sum < min) {
                                min = sum;
                            }
                        }
                    }
                }
            }
            System.out.printf("%.02f", min);
        }
        //计算两点之间距离
        public static double getDistance(Point a, Point b) {
            return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));
        }
    }
    class Point {
        int x;
        int y;
        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • bluetata 云计算领域优质创作者 2023-03-06 20:16
    关注

    本题主要考虑怎么遍历每个四点组合,由于每个点有两个坐标,所以可以采用双层循环实现遍历,每两个点之间计算出距离,然后将距离加起来取平均值,比较所有的平均值,得出最小的平均值即为结果。

    可以参考一下ChatGPT的实现代码:

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            double[][] points = new double[10000][2];
            int index = 0;
            while(sc.hasNextLine()){
                String[] str = sc.nextLine().split(",");
                points[index][0] = Double.parseDouble(str[0]);
                points[index][1] = Double.parseDouble(str[1]);
                index++;
            }
            double min = Double.MAX_VALUE;
            for(int i=0;i<index;i++){
                for(int j=i+1;j<index;j++){
                    for(int k=j+1;k<index;k++){
                        for(int l=k+1;l<index;l++){
                            double distance = getDistance(points[i],points[j]) + getDistance(points[i],points[k]) + getDistance(points[i],points[l]) + getDistance(points[j],points[k]) + getDistance(points[j],points[l]) + getDistance(points[k],points[l]);
                            distance /= 6;
                            if(distance<min){
                                min = distance;
                            }
                        }
                    }
                }
            }
            System.out.printf("%.2f\n",min);
        }
        
        private static double getDistance(double[] point1, double[] point2){
            return Math.sqrt(Math.pow(point1[0]-point2[0],2) + Math.pow(point1[1]-point2[1],2));
        }
    }
    
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 3月6日

悬赏问题

  • ¥15 k210显示failed init to model
  • ¥15 Evil-droid生成的APK手机已经下载但无法建立任务
  • ¥25 c语言韩信点兵的变式
  • ¥15 怎么根据书上的例子完成这个问题呢?
  • ¥15 ECharts 增加Zoom,整行包括右边的Text一起滑动
  • ¥15 关于网上一个easyx制作的见缝插针小游戏(c++)
  • ¥15 开地址法双散列函数处理碰撞
  • ¥15 想问一下这个是什么情况 虚拟机Linux打不开了
  • ¥15 联通光猫掉注册了怎么重新注册上去
  • ¥15 关于unity开发steamvr程序遇到的问题