华为OD机试真题-矩形绘制

题目描述

实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除

  • 当新绘制的矩形与之前的图形重善时,对图形取并集

  • 当新擦除的矩形与之前的图形重善时,对图形取差集

给定一系列矩形的绘制和擦除操作,计算最终图形的面积。下面给出示例1和示例2的图示

示例1

在这里插入图片描述

两步绘制的矩形如左侧所示,取并集后得到的图形如右侧所示

示例2
在这里插入图片描述

第一步绘制的矩形在左侧用实线表示,第二步擦除的矩形在左侧用虚线表示,取差集后得到图像如右侧所示

输入描述

绘图模块采用二维 坐标系只,输入第一行位操作的数量 N,接下来的 N 行格式为:

  • d x1 y1 x2 y2,d表示进行绘制操作,(x1,y1)为矩形左上角坐标,(x2,y2)为矩形右下角坐标
  • e x1 y1 x2 y2,e表示进行擦除操作,(x1,y1)为矩形左上角坐标,(x2,y2)为矩形右下角坐标坐

标为整数,且数据范围为[-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

题解

把每次的矩形分解称为一个个的小方格,方格的数量即为面积的总和

源码 Java

import java.util.HashSet;

public class DrawArea {

	static Input input;
	static {
		input = new Input("2\n" +
				"d 0 2 2 0\n" +
				"d -1 1 1 -1");
		input = new Input("2\n" +
				"d 0 2 2 0\n" +
				"e -1 1 1 -1");
	}

	public static void main(String[] args) {
		Integer count = Integer.parseInt(input.nextLine());
		HashSet<String> set = new HashSet<>();
		for (int i = 0; i < count; i++) {
			String[] ss = input.nextLine().split(" ");
			String type = ss[0];
			int x1 = Integer.parseInt(ss[1]);
			int y1 = Integer.parseInt(ss[2]);
			int x2 = Integer.parseInt(ss[3]);
			int y2 = Integer.parseInt(ss[4]);
			for (int x = x1; x < x2; x++) {
				for (int y = y1; y > y2; y--) {
					String string = new StringBuilder().append(x).append(y).append(x + 1).append(y - 1).toString();
					if ("d".equals(type)) {
						set.add(string);
					}
					if ("e".equals(type)) {
						set.remove(string);
					}
				}
			}
		}
		System.out.println(set.size());
	}
}
### 华为OD中的房布局题目解析 对于华为OD中涉及的房布局问题,具体的要求是在一排柜上合理布置电箱以确保每个柜旁边都有至少一个电箱。如果无法满足条件,则应返回 `-1`。 #### 题目描述 给定字符串表示的一排房设备布局,其中 `M` 表示柜而 `I` 则代表间隔区域。目标是计算最少需要放置多少个电箱来保障所有柜能够正常运作;若不存在可行方案则输出特殊标记 `-1`[^2]。 #### 解决思路 该类问题可以通过遍历输入串并记录当前最近一次遇到的未被覆盖到的柜位置来进行求解。当发现柜时检查之前是否有足够的空间安放电源装置而不违反规则。最终依据所剩待处理情况决定能否成功完成分配或是宣告失败即返回错误码 `-1`。 ```python def min_electric_boxes(layout): last_uncovered = None electric_box_count = 0 for i, char in enumerate(layout): if char == 'M': if last_uncovered is not None and (i - last_uncovered) > 2: return -1 if last_uncovered is not None or i != len(layout)-1: electric_box_count += 1 last_uncovered = i # Check the final uncovered position if last_uncovered is not None and ((len(layout) - 1 - last_uncovered) > 1): return -1 return electric_box_count if any(c=='M' for c in layout) else 0 ``` 此函数接收一个由字符组成的列表作为参数,这些字符用来描绘整个数据中心内部连续排列着的各种设施。“M”意味着此处存在一台服务器,“I”则是空白处。程序逻辑在于沿着这条线性路径前进的同时维护两个变量:一个是计数器用于统计所需最小数量的电力供应单元数目;另一个是指向最访问过的尚未得到适当供电支持的服务站索引值。每当触及一个的服务站点时就会评估从前一处到现在这段距离内是否允许增加额外的能量源点。最后一步是对末端情况进行特别审查以防遗漏任何潜在违规情
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚定的小辣鸡在努力

你的支持是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值