蓝桥杯2023年第十四届Java省赛真题-矩形总面积

时间:2024-03-11 22:38:00

题目描述

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

注意:如果 R1 和 R2 有重叠区域,重叠区域的面积只计算一次。

输入格式

输入只有一行,包含 8 个整数,依次是:x1,y1,x2,y2,x3,y3,x4 和 y4

输出格式

一个整数,代表答案。

样例输入

复制

2 1 7 4 5 3 8 6

样例输出

复制

22

提示

样例中的两个矩形如图所示:

蓝桥杯2023年第十四届省赛真题-矩形总面积

对于 20% 的数据,R1 和 R2 没有重叠区域。

对于 20% 的数据,其中一个矩形完全在另一个矩形内部。

对于 50% 的数据,所有坐标的取值范围是 [0, 103 ]。

对于 100% 的数据,所有坐标的取值范围是 [0, 105 ]。

代码

import java.util.Scanner;
import static java.lang.Math.*;
//引入Math类,不用加Math前缀

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int x1 = scanner.nextInt(), y1 = scanner.nextInt();
        int x2 = scanner.nextInt(), y2 = scanner.nextInt();
        int x3 = scanner.nextInt(), y3 = scanner.nextInt();
        int x4 = scanner.nextInt(), y4 = scanner.nextInt();

        long area = (long)abs(x2 - x1) * abs(y2 - y1) + (long)abs(x4 - x3) * abs(y4 - y3);
        //单个输入不会int溢出,但int*int可能会造成溢出,因此面积转换long
        int width = max(0, min(x4,x2) - max(x1,x3));
        int height = max(0, min(y4,y2) - max(y1,y3));
        //如果最小的右上角坐标大于最大的左下角坐标,就证明有重复,否则重复面积为0
        long sumArea = area - (long)width*height;//注意这里需要加(long)进行转换,否则会产生long-int误差,导致有些案例通过不了
        System.out.println(sumArea);
    }
}