问题描述
输入输出
解题思路
首先看到这道模拟题竟然下意识地想到用二维数组去模拟面积点,遍历后若占有则标记,若标记两次则为重叠区域。但是很快就否定了这个想法,因为面积可能会很大,甚至超出所能开辟的数组范围,而且坐标有四个象限,有正负。当然,正负可以通过同时加上最小值的绝对值来解决,毕竟挪个位置面积是不变的。
最终的方法就是通过画图找规律得出的,通过分析两个矩形的边界关系得出以下结论,可以求得矩形重叠部分。
既然上面的做法是在讨论边界,那么就要对题目的输入——点的坐标,转化一下变成边界。
注意:数据类型要用long,因为根据题目说明的数据大小,相乘后可能会超出int能表示的最大范围(int最大值略大于10的9次方)。
AC代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 读入上下右左边界
long l1 = scan.nextInt();
long d1 = scan.nextInt();
long r1 = scan.nextInt();
long u1 = scan.nextInt();
long l2 = scan.nextInt();
long d2 = scan.nextInt();
long r2 = scan.nextInt();
long u2 = scan.nextInt();
// 计算两个矩阵面积
long area1 = (r1 - l1) * (u1 - d1);
long area2 = (r2 - l2) * (u2 - d2);
// 计算最右左边界、最左右边界、最下上边界、最上下边界
long ll = Math.max(l1, l2);
long rr = Math.min(r1, r2);
long uu = Math.min(u1, u2);
long dd = Math.max(d1, d2);
// 判断不相交的情况
if (ll > rr || uu < dd) {
System.out.println(area1 + area2);
} else {// 减去重叠部分
System.out.println(area1 + area2 - (rr - ll) * (uu - dd));
}
}
}
(by 归忆)