欢迎使用CSDN-markdown编辑器

算法(第四版)课后题

1.2.1 问题:编写一个Point2D的用例,从命令行接受一个整数N。在单位正方形中生成N个随机点,然后计算两点之间的最近距离。

代码块

public static void main(String[] args)
        {
           int N = Integer.parseInt(args[0]);
           Point2D[] p = new Point2D[N];
           /*生成N个点*/
           for(int t=0;t<N;t++){
           double x = Math.random();
           double y = Math.random();
           p[t] = new Point2D(x,y);
           p[t].draw();
           }
          /*逐个增加点数,与之前存在的点构成线段族,然后进行比较大小*/ 
           double min = p[0].distanceTo(p[1]);
           if(N<=1)
             StdOut.println("N不能小于1");
               else if(N==2)
                 StdOut.println("最小距离为:"+p[0].distanceTo(p[1]));
               else {
                 for(int i=2;i<=N;i++)
                   for(int j=i-1;j>0;j--){
                     double dis=p[i].distanceTo(p[j]);
                     if(dis<min) min=dis;
                     }
                   }
                   StdOut.println(N+"个点中的最小距离是"+min);
}

思路

首先,N=1时只有一个点,命题不成立;当N=2时,两点之间只有一个直线距离;
当N>3时,就会出现多条线段。但是我们可以发现一个规律:如果现在平面上有两个点,再增加一个点,总线段会增加两个;若现在有三个点,再增加一个点会相应增加3条线···若现在有N-1个点,再增加一个点,会增加(N-1)条线。这样就会避免一些重复的长度比较。
点赞