CCF coordinate system drawing

Problem Description

在一一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围
从y1到y2之间的区域涂上颜色。下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿
色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,
其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统-的颜色,图中
显示不同颜色仅为说明方便。

给出所要画的矩形,请问总共有多少个单位的矩形被涂上颜色?

Input format
The first line of input contains an integer n, which represents the number of rectangles to be drawn.
In the next n rows, each row has 4 non-negative integers, which respectively represent the horizontal and vertical coordinates of the lower left corner of the rectangle to be drawn, and the horizontal and vertical coordinates of the upper right corner.
Insert picture description here

/**
 *   Aurora   2020年4月17日
问题描述
	在一一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围
	从y1到y2之间的区域涂上颜色。下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿
	色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,
	其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统-的颜色,图中
	显示不同颜色仅为说明方便。
	
	给出所要画的矩形,请问总共有多少个单位的矩形被涂上颜色?
输入格式
	输入的第一行包含一个整数n,表示要画的矩形的个数。
	接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。

 */

import java.util.HashSet;
import java.util.Scanner;
public class CCF坐标系画图 {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
		HashSet<UnitGrid> set=new HashSet<UnitGrid>();
		// 表示这个集合中只能保存UnitGrid 类型的对象,其他对象无法保存
		// 取出时 也直接是这个 UnitGrid 对象,不需要强转,在写代码的时候,方便写入和取出
		int []axis=new int[4];
		for(int i=1;i<=n;i++) {
			for(int j=0;j<4;j++) {
				axis[j]=s.nextInt();
			}
			set.addAll(transferToUniteGrid(axis[0],axis[1],axis[2],axis[3]));
			
		}
		System.out.println(set.size());//将集合大小输出(也就是题目想求得的单位矩形的个数)
	}
	/* 定义一个私有的静态内部类,
	 * public(公有的) ...;
	 * private(私有的)仅仅能被当前类的成员访问;
	 * protected(受保护的)除了当前类以外,仅仅能被子类及同一个包中的类访问;
	 *///开始向set集合中添加元素(间接统计单位矩形的个数set.size())
	private static HashSet<UnitGrid> transferToUniteGrid(int x1,int y1,int x2,int y2){
		//实例化UnitGrid ,实例化后 UnitGrid 是HashSet类型的对象
		HashSet<UnitGrid> set=new HashSet<UnitGrid>();
		for(int i=x1;i<x2;i++) {//不包括上界
			for(int j=y1;j<y2;j++) {
				//把大矩形分割成小的单位矩形,分割一个,就向
				set.add(new UnitGrid(i,j));//向集合里面添加坐标元素
			}
		}
		return set;
	}
}
class UnitGrid{
	int x,y;//用左下角的坐标来代表一个UnitGrid 
	public UnitGrid(int x,int y) {//x y是局部变量
		this.x=x;//x y是成员变量
		this.y=y;
	}
	@Override// 重写 equals 方法,若左下角坐标一致,则相等  
	public boolean equals(Object o) {
		if(o==null) return false;
		if(!(o instanceof UnitGrid)) return false;
		UnitGrid ug=(UnitGrid)o;
		if((this.x==ug.x) && (this.y==ug.y)) {
			return true;
		}
		return false;
	}
	@Override//重写hashCode方法
	public int hashCode() {
		//如果两个UnitGrid 的x,y相等,则为同一元素
		int result=17;
		return (37*result +this.x)*37+this.y;
	}
}
Now
Published 41 original articles · praised 1 · visits 1288

Guess you like

Origin blog.csdn.net/DAurora/article/details/105576076