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