CCF座標系の描画

問題の説明

在一一个定义了直角坐标系的纸上,画一个(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;
	}
}
41件の元の記事を公開 賞賛1 訪問1288

おすすめ

転載: blog.csdn.net/DAurora/article/details/105576076
おすすめ