算法-第四版-练习1.2.3解答

解题思路

编写一个Interval2D的用例,从命令行接受参数N、min和max。生成N个随机的2D间隔,其宽度和高均匀地分布在单位正方形中的min和max之间。用StdDraw画出它们并打印出相交的间隔对的数量以及有包含关系的间隔对数量

代码

package homework1_2;

import edu.princeton.cs.algs4.Interval1D;
import edu.princeton.cs.algs4.Interval2D;
import edu.princeton.cs.algs4.Point2D;
import edu.princeton.cs.algs4.StdRandom;

/**
 * @description: ${description}
 * @create: 2019-02-07
 **/
public class E_1_2_3 {
    public static void main(String[] args) {
        int N = 20;//Integer.parseInt(args[0]);
        double min = 0.1;//Double.parseDouble(args[1]);
        double max = 0.9;//Double.parseDouble(args[2]);
        Interval2D[] dd = new Interval2D[N];
        Point2D[] p2d1 = new Point2D[N];
        Point2D[] p2d2 = new Point2D[N];
        for (int i = 0; i < N; i++) {
            double xlo = StdRandom.uniform(min, max);
            double xhi = StdRandom.uniform(min, max);
            if (xlo > xhi) {
                double temp = xlo;
                xlo = xhi;
                xhi = temp;
            }
            double ylo = StdRandom.uniform(min, max);
            double yhi = StdRandom.uniform(min, max);
            if (ylo > yhi) {
                double temp = ylo;
                ylo = yhi;
                yhi = temp;
            }
            p2d1[i] = new Point2D(xlo, ylo);
            p2d2[i] = new Point2D(xhi, yhi);

            Interval1D idx = new Interval1D(xlo, xhi);
            Interval1D idy = new Interval1D(ylo, yhi);
            dd[i] = new Interval2D(idx, idy);
        }
        for (int i = 0; i < N; i++) {
            dd[i].draw();
        }
        int count = 0;//相交
        for (int i = 0; i < N - 1; i++) {
            for (int j = i + 1; j < N; j++) {
                boolean intersects = dd[i].intersects(dd[j]);
                if (intersects) {
                    count++;
                }
            }
        }
        System.out.println("相交的间隔对数量为: " + count);
        int count2 = 0;//包含
        for (int i = 0; i < N - 1; i++) {
            for (int j = i + 1; j < N; j++) {
                // 第i个间隔对包含第j个间隔对
                if (p2d1[i].x() < p2d1[j].x() && p2d1[i].y() < p2d1[j].y() && p2d2[i].x() > p2d2[j].x() && p2d2[i].y() > p2d2[j].y()) {
                    count2++;
//                   System.out.println("--------------");
//                   System.out.println(p2d1[i].x()+" "+p2d1[i].y()+" "+p2d2[i].x()+" "+p2d2[i].y());
//                   System.out.println(p2d1[j].x()+" "+p2d1[j].y()+" "+p2d2[j].x()+" "+p2d2[j].y());
//                   System.out.println("--------------");
                }
                // 第j个间隔对包含第i个间隔对
                if (p2d1[i].x() > p2d1[j].x() && p2d1[i].y() > p2d1[j].y() && p2d2[i].x() < p2d2[j].x() && p2d2[i].y() < p2d2[j].y()) {
                    count2++;
//                    System.out.println("--------------");
//                    System.out.println(p2d1[i].x()+" "+p2d1[i].y()+" "+p2d2[i].x()+" "+p2d2[i].y());
//                    System.out.println(p2d1[j].x()+" "+p2d1[j].y()+" "+p2d2[j].x()+" "+p2d2[j].y());
//                    System.out.println("--------------");
                }
            }
        }
        int count3 = 0;//包含
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (i != j && dd[i].contains(p2d1[j]) && dd[i].contains(p2d2[j])) {
                    count3++;
                }
            }
        }
        System.out.println("包含2的间隔对数量为: " + count2);
        System.out.println("包含3的间隔对数量为: " + count3);
    }
}

结果

在这里插入图片描述

控制台

在这里插入图片描述

解题思路

1 相交的间隔对:直接利用现成的api即可,1和2相交的话,那么2就不用和1对比了 所以j>i
2 包含的间隔对:额外存储2个Point2D数组来记录每个Interval2D的坐标,可以利用间隔包含PointD来判断,也可以利用大小来判断,
1不包含2的话,可能2包含1.所以i和j都是全部去遍历

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值