华为OD E卷(100分)42-矩形相交面积
前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
在平面直角坐标系中,给出 3 个矩形的位置信息。每个矩形由左上角坐标 (x,y) 和宽度 h 表示。
矩形的边平行于坐标轴,宽度向右延伸,高度向下延伸。请计算这 3 个矩形重叠部分的面积。
输入
输入共 3 行,每行包含 4 个整数
x、y、w、h,分别表示一个矩形的左上角 x 坐标、左上角 y 坐标、宽度和高度。
输出
输出一个整数,表示 3 个矩形重叠部分的面积。如果没有重叠,则输出 0。
示例
示例1
输入
1 6 4 4
3 5 3 4
0 3 7 3
输出2
说明:三个矩形分别为:
1. (1,6) 到 (5,2)
2. (3,5) 到 (6,1)
3. (0,3) 到 (7,0) 重叠部分面积为 2
数据范围
- −1000≤x,y<1000
- w,h 为正整数
解题思路
矩阵填充。
题解
Java实现
package huawei.e100;
import java.util.Arrays;
import java.util.Scanner;
/**
* @author arnold
* @date 2024年12月27日
* 矩形相交面积
*/
public class T42 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int[][] data = new int[2000][2000];
for (int i = 0; i < data.length; i++) {
Arrays.fill(data[i], 0);
}
for (int i = 0; i < 3; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
int w = sc.nextInt();
int h = sc.nextInt();
for(int m = x; m< x+w; m++) {
//高度向下延伸
for(int n = y; n > y-h; n--) {
data[m][n] += 1;
}
}
}
int area = 0;
for (int i = 0; i < data.length; i++) {
area += Arrays.stream(data[i]).filter(a -> a==3).count();
}
System.out.println(area);
}
}
}