华为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());
}
}