Exercise1.2.1

1.2.1 Write a Point2D client that takes an integer value N from the command line, generates N random points in the unit square, and computes the distance separating the closest pair of points.

image-20210806161957329

image-20210806203614573

image-20210806203354093

图片来源:《Algorithms 4 Edition》
import edu.princeton.cs.algs4.Point2D;
import edu.princeton.cs.algs4.StdDraw;
import edu.princeton.cs.algs4.StdRandom;
public class E121 {
    public static void main(String[] args) {
        int N = Integer.parseInt(args[0]);
        StdDraw.setCanvasSize(400, 400);//画布大小
        StdDraw.setXscale(0, 100);
        StdDraw.setYscale(0, 100);
        StdDraw.setPenRadius(0.01);
        StdDraw.enableDoubleBuffering();//画点停顿呈现动画效果
        Point2D[] points = new Point2D[N];
        //初始化N个随机点坐标
        for (int i = 0; i < N; i++)
        {
            points[i] = new Point2D(StdRandom.uniform(100), StdRandom.uniform(100));
            points[i].draw();
        }
        //计算两点间的欧式距离
        double minDistance = points[0].distanceTo(points[1]);
        int[] twoPoint = new int[2];//用一个整型数组记录最小距离的两个点
        twoPoint[0] = 0;twoPoint[1] = 1;
        for (int i = 0;i < N;i++)
        {
            for(int j = i + 1;j < N;j++)
            {
                double tempDistance = points[i].distanceTo(points[j]);
                if (tempDistance < minDistance) 
                {
                    minDistance = tempDistance;
                    twoPoint[0] = i;
                    twoPoint[1] = j;
                }
            }
        }
        //红色标记距离最近的两点并将两点之间的连线画出
        StdDraw.setPenColor(StdDraw.RED);
        // StdDraw.setPenRadius(0.02);
        points[twoPoint[0]].draw();
        points[twoPoint[1]].draw();
        points[twoPoint[0]].drawTo(points[twoPoint[1]]);
        StdDraw.show();
        System.out.printf("距离最小的两个点是:%d,%d,其距离为%f", twoPoint[0],twoPoint[1],minDistance);
    }
}
距离为%f", twoPoint[0],twoPoint[1],minDistance);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值