题目描述
实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除
-
当新绘制的矩形与之前的图形重善时,对图形取并集
-
当新擦除的矩形与之前的图形重善时,对图形取差集
给定一系列矩形的绘制和擦除操作,计算最终图形的面积。下面给出示例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());}
}