华为OD机试真题——矩形绘制(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

发布于:2025-05-30 ⋅ 阅读:(22) ⋅ 点赞:(0)

在这里插入图片描述

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 y2d表示绘制操作,(x1,y1)为矩形左上角坐标,(x2,y2)右下角坐标;
  • e x1 y1 x2 y2e表示擦除操作,坐标含义同上。
    坐标均为整数且范围在[-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

问题分析

我们需要处理一系列的矩形绘制和擦除操作,最终计算剩余图形的面积。每次操作会影响当前图形的覆盖区域,绘制操作会合并重叠区域,而擦除操作会移除重叠区域。核心在于高效表示和处理这些矩形的覆盖区域。

解题思路

  1. 小方格分解:将每个矩形分解为1x1的小方格,使用集合存储这些方格。
  2. 并集与差集操作:绘制操作将方格加入集合,擦除操作将方格移出集合。
  3. 面积计算:最终集合的大小即为剩余方格的个数,即面积。

代码实现

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 <= yHigh
            int 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()); // 输出剩余格子数量即面积
    }
}

代码详细解析

  1. 读取输入:首先读取操作数 N,然后逐行读取每个操作。
  2. 坐标处理:确保矩形的 xy 坐标的正确顺序,以便正确遍历所有覆盖的小方格。
  3. 编码格子:将每个方格的坐标 (x, y) 编码为一个唯一的整数,例如 x * 1000 + y,避免字符串操作提升效率。
  4. 集合操作:根据操作类型(de)添加或移除对应的格子。
  5. 输出结果:集合的大小即为最终覆盖的格子数量,即所求面积。

示例测试

示例1
输入:

2
d 0 2 2 0
d -1 1 1 -1

输出:

7

解析:两个矩形覆盖的方格分别为4个和4个


网站公告

今日签到

点亮在社区的每一天
去签到