题目描述
平面上有个两个矩形 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
提示
样例中的两个矩形如图所示:
对于 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);
}
}