分配土地(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

相关文章

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

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