分配土地(HashMap(Integer, ArrayList<OneField>))

2024-04-10 19:04

本文主要是介绍分配土地(HashMap(Integer, ArrayList<OneField>)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述
从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。

某天集体村民决定将覆盖相同数字的最大矩阵形的土地分配给村里做出巨大贡献的村民,请问此次分配土地,做出贡献的村民种最大会分配多大面积?

输入描述
第一行输入 m 和 n,

m 代表村子的土地的长
n 代表土地的宽
第二行开始输入地图上的具体标识

输出描述
此次分配土地,做出贡献的村民种最大会分配多大面积

备注
旗子上的数字为1~500,土地边长不超过500
未插旗子的土地用0标识
用例1
输入
3 3
1 0 1
0 0 0
0 1 0
输出
9
说明
土地上的旗子为1,其坐标分别为(0,0),(2,1)以及(0,2),为了覆盖所有旗子,矩阵需要覆盖的横坐标为0和2,纵坐标为0和2,所以面积为9,即(2-0+1)*(2-0+1)= 9

用例2
输入
3 3
1 0 2
0 0 0
0 3 4
输出
1
说明
由于不存在成对的小旗子,故而返回1,即一块土地的面积。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Scanner;class OneField{public int i;public int j;public int value;OneField(int i, int j, int value){this.i=i;this.j=j;this.value = value;}
}public class Main{public static void main(String []args){// 计算矩阵右下角 横纵坐标最大值// 计算矩阵左下角 横纵坐标最小值Scanner in = new Scanner(System.in);int row = in.nextInt();int col = in.nextInt();// 存储输入的行列数int [][] field = new int[row][col];// 存储 输入的矩阵int [] symbol = new int [501];// 标志 每个数值的出现次数ArrayList<Integer> martixValue = new ArrayList<Integer>();// 记录找到的相同数字围起来的矩阵的面积,最后从中取出最大值// 若都没有相同数字 即 出现一个数字的次数 <=1 则没有矩阵 直接返回数字 1HashMap<Integer, ArrayList<OneField>> map = new HashMap<>();// 设计一个map key值为相同数字  ArrayList中存储一个OneField类型的链表// 把每个相同数字的元素包装成一个field对象存为一个链表// 通过key 来访问同一个数字 下 每个元素的 位置坐标 //取出位置坐标的最大最小值 计算矩阵大小 将结果存入记录所有矩阵面积的链表for(int i=0;i<row;i++){for(int j=0;j<col;j++){field[i][j] = in.nextInt();//System.out.print(field[i][j] + " ");if(field[i][j] > 0){symbol[field[i][j]]++;OneField oneField = new OneField(i,j,field[i][j]);if(map.get(Integer.valueOf(field[i][j])) == null){ArrayList<OneField> fields = new ArrayList<OneField>();fields.add(oneField);map.put(field[i][j],fields);}else{ArrayList<OneField> fields = map.get(Integer.valueOf(field[i][j]));fields.add(oneField);}}}}/*for(int i=0;i<symbol.length;i++){if(symbol[i]>=1){// 至少出现了一次ArrayList<OneField> fields = map.get(i);if(fields!=null){for(OneField oneField:fields){System.out.println(oneField.i + " " + oneField.j + " " + oneField.value);}}}}*/int moreThan2 = 0;for(int i=0;i<symbol.length;i++){if(symbol[i]>=2){moreThan2 = 1;// 至少出现了2次 才能构成矩阵ArrayList<OneField> fields = map.get(i);if(fields!=null){int rowvalue[] = new int[fields.size()];int colvalue[] = new int[fields.size()];int t = 0;for(OneField oneField:fields){//System.out.println(oneField.i + " " + oneField.j + " " + oneField.value);rowvalue[t] = oneField.i;colvalue[t] = oneField.j;t++;}int minrow = Arrays.stream(rowvalue).min().getAsInt();int mincol = Arrays.stream(colvalue).min().getAsInt();int maxrow = Arrays.stream(rowvalue).max().getAsInt();int maxcol = Arrays.stream(colvalue).max().getAsInt();//System.out.println("value: " + i + " " + minrow +" "+ mincol +" "+maxrow +" " + maxcol +" " );int square = (maxrow-minrow+1)*(maxcol-mincol+1);martixValue.add(square);}}}if(moreThan2 == 0){//System.out.println("相同数字的最大矩阵大小:" + 1);System.out.println(1);}else{int maxSquare = Collections.max(martixValue);//System.out.println("相同数字的最大矩阵大小: "+maxSquare);System.out.println(maxSquare);}}
}

这篇关于分配土地(HashMap(Integer, ArrayList<OneField>))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891878

相关文章

nginx upstream六种方式分配小结

《nginxupstream六种方式分配小结》本文主要介绍了nginxupstream六种方式分配小结,包括轮询、加权轮询、IP哈希、公平轮询、URL哈希和备份服务器,具有一定的参考价格,感兴趣的可... 目录1 轮询(默认)2 weight3 ip_hash4 fair(第三方)5 url_hash(第三

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

操作系统是怎么为不同的程序分配所需的内存空间的

操作系统为不同的程序分配内存空间的过程涉及多个关键步骤,确保每个程序都有其所需的内存资源,同时避免程序之间的冲突。以下是操作系统如何为程序分配内存空间的详细过程: 1. 内存管理的基础概念 虚拟内存:现代操作系统使用虚拟内存机制来为程序提供隔离的内存空间。每个程序运行在其独立的虚拟地址空间中,这使得程序间的内存互不干扰。物理内存:实际的 RAM(随机存取存储器),由操作系统和硬件共同管理。虚拟

利用PL/SQL工具如何给指定用户分配权限

选中指定的表--右键--编辑--就出现右边的内容了,选择权限,分配用户某个权限就行了;

List list = new ArrayList();和ArrayList list=new ArrayList();的区别?

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。 List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了A

HashMap中常用的函数

假设如下HashMap<String, Integer> map = new HashMap<>();获取value值1、返回key为a的valueget(a)2、返回key为a的value,若没有该key返回0getOrDefault(a,0)新增键值对1、新增键值对(a,1)put(a,1)2、如果key为a的键不存在,则存入键值对(a,1)putIfAbsent(a,1)3