蓝桥 java 矩形总面积

试题 D: 矩形总面积

平面上有个两个矩形 R1 和 R2,它们各边都与坐标轴平行。设 (x1, y1) 和 (x2, y2) 依次是 R1 的左下角和右上角坐标,(x3, y3) 和 (x4, y4) 依次是 R2 的左下 角和右上角坐标,请你计算 R1 和 R2 的总面积是多少? 注意:如果 R1 和 R2 有重叠区域,重叠区域的面积只计算一次。

【输入格式】 一行,8个整数,分别表示矩形R1的左下角坐标(x1, y1)和右上角坐标(x2, y2),以及矩形R2的左下角坐标(x3, y3)和右上角坐标(x4, y4)。

【输出格式】 一个整数,表示矩形R1和R2的总面积。

【样例输入】 2 1 7 4 5 3 8 6

【样例输出】 22

 

 

讲下我的思路

1.先判断是否有相交,如果没有相交,那么直接计算两个矩形面积就行

2.如果矩阵相交,只需要把重叠部分的面积算出来

这里讲一下如何计算重叠部分的面积

 

要计算Δx,只需要得到被夹在中间的两条竖线的横坐标,做差就可以得到Δx

那么,要得到中间两条边的横坐标,可以对他进行一个排序

Δy同理

 附上代码

 

import java.util.Arrays;
import java.util.Scanner;

public class Main {

    static boolean f(int l, int r, int ll, int rr){
        if(l < ll && ll < r)return true;
        if(l < rr && rr < r)return true;
        return false;
    }

    static int area(int x1, int x2, int y1, int y2){
        int xlong = x2 - x1;
        int ylong = y2 - y1;
        return xlong * ylong;
    }

    public static void main(String[] args) {
        int[] x = new int[5];
        int[] y = new int[5];
        Scanner sc = new Scanner(System.in);
        for (int i = 1; i <= 4; i++) {
            x[i] = sc.nextInt();
            y[i] = sc.nextInt();
        }

        int[] arrx = new int[4];
        int[] arry = new int[4];

        for (int i = 0; i < 4; i++) {
            arrx[i] = x[i + 1];
            arry[i] = y[i + 1];
        }

        Arrays.sort(arrx);
        Arrays.sort(arry);
        if(f(x[1], x[2], x[3], x[4]) && f(y[1], y[2], y[3], y[4])){
            int x1 = arrx[1];
            int x2 = arrx[2];
            int y1 = arry[1];
            int y2 = arry[2];

            int t = area(x1, x2, y1, y2);
            System.out.println(area(x[1], x[2], y[1], y[2]) + area(x[3], x[4], y[3], y[4]) - t);
            return;
        }
        if(f(x[3], x[4], x[1], x[2]) && f(y[3], y[4], y[1], y[2])){
            int x1 = arrx[1];
            int x2 = arrx[2];
            int y1 = arry[1];
            int y2 = arry[2];

            int t = area(x1, x2, y1, y2);
            System.out.println(area(x[1], x[2], y[1], y[2]) + area(x[3], x[4], y[3], y[4]) - t);
            return;
        }

        System.out.println(  area(x[1], x[2], y[1], y[2]) + area(x[3], x[4], y[3], y[4])  );
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值