华为OD机试真题——矩形绘制(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 200分 题型
本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《矩形绘制》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C
GO
题目名称:矩形绘制
知识点:字符串、集合操作、逻辑处理
时间限制:1秒
空间限制:256MB
限定语言:不限
题目描述
实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除。
- 当新绘制的矩形与已有图形重叠时,对图形取并集;
- 当新擦除的矩形与已有图形重叠时,对图形取差集。
给定一系列绘制和擦除操作,计算最终图形的面积。
输入描述
第一行为操作数N,接下来的N行格式为:
d x1 y1 x2 y2
:d
表示绘制操作,(x1,y1)
为矩形左上角坐标,(x2,y2)
为右下角坐标;e x1 y1 x2 y2
:e
表示擦除操作,坐标含义同上。
坐标均为整数且范围在[-100, 100]内,用例保证坐标有效性。
输出描述
输出最终图形的面积。
示例1
输入:
2
d 0 2 2 0
d -1 1 1 -1
输出:
7
示例2
输入:
2
d 0 2 2 0
e -1 1 1 -1
输出:
3
说明
- 核心思路:将矩形分解为小方格(如1x1单元),通过集合存储有效方格,最终统计总数即为面积。
- 关键操作:遍历矩形范围内的所有小格,根据操作类型(
d
/e
)增减集合内容。
Java
问题分析
我们需要处理一系列的矩形绘制和擦除操作,最终计算剩余图形的面积。每次操作会影响当前图形的覆盖区域,绘制操作会合并重叠区域,而擦除操作会移除重叠区域。核心在于高效表示和处理这些矩形的覆盖区域。
解题思路
- 小方格分解:将每个矩形分解为1x1的小方格,使用集合存储这些方格。
- 并集与差集操作:绘制操作将方格加入集合,擦除操作将方格移出集合。
- 面积计算:最终集合的大小即为剩余方格的个数,即面积。
代码实现
import java.util.HashSet;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = Integer.parseInt(scanner.nextLine()); // 读取操作数HashSet<Integer> set = new HashSet<>(); // 存储所有被覆盖的格子for (int i = 0; i < N; i++) {String[] parts = scanner.nextLine().split(" ");String op = parts[0];int x1 = Integer.parseInt(parts[1]);int y1 = Integer.parseInt(parts[2]);int x2 = Integer.parseInt(parts[3]);int y2 = Integer.parseInt(parts[4]);// 处理坐标顺序,确保xStart <= xEnd,yLow <= yHighint xStart = Math.min(x1, x2);int xEnd = Math.max(x1, x2);int yLow = Math.min(y1, y2);int yHigh = Math.max(y1, y2);// 遍历所有i和j,生成格子的唯一编码for (int x = xStart; x < xEnd; x++) { // x的范围是[xStart, xEnd)for (int y = yLow; y < yHigh; y++) { // y的范围是[yLow, yHigh)int code = x * 1000 + y; // 将坐标编码为唯一整数if (op.equals("d")) {set.add(code); // 绘制操作:添加格子} else {set.remove(code); // 擦除操作:移除格子}}}}System.out.println(set.size()); // 输出剩余格子数量即面积}
}
代码详细解析
- 读取输入:首先读取操作数
N
,然后逐行读取每个操作。 - 坐标处理:确保矩形的
x
和y
坐标的正确顺序,以便正确遍历所有覆盖的小方格。 - 编码格子:将每个方格的坐标
(x, y)
编码为一个唯一的整数,例如x * 1000 + y
,避免字符串操作提升效率。 - 集合操作:根据操作类型(
d
或e
)添加或移除对应的格子。 - 输出结果:集合的大小即为最终覆盖的格子数量,即所求面积。
示例测试
示例1:
输入:
2
d 0 2 2 0
d -1 1 1 -1
输出:
7
解析:两个矩形覆盖的方格分别为4个和4个