试题 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]) );
}
}