当前位置: 首页 > news >正文

旗帜分田(华为od机考题)

一、题目

1.原题

从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。
某天集体村民决定将覆盖相同数字的最小矩阵形的土地的分配给为村里做出巨大贡献的村民,
请问,此次分配土地,做出贡献的村民中最大会分配多大面积?

2.题目理解

覆盖相同数字的最小矩阵形:①相同数字;②最小矩形。

二、思路与代码过程

1.思路

输入:田地大小m*n

矩阵格子值:

1 9 9 7

0 3 0 6

2 0 0 2

1 0 3 0

将矩阵的值输入到hash表中,排除重复值(并删除空地0),从hash表中依次取出值,放入位置计算函数(位置计算函数可以只记录最小值,也可以保存全部值只返回最小值)。

2.代码过程

①main函数

public static void main(String[] args) {/*输入矩阵大小,输入矩阵上的旗帜分布,对不同的旗帜所占面积进行计算*/Scanner sc = new Scanner(System.in);System.out.println("请输入田地的长宽:");int m = sc.nextInt();int n = sc.nextInt();System.out.println("请输入旗帜分布:");int[][] flag = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {flag[i][j] = sc.nextInt();}}//System.out.println("已知田地长为"+m+",宽为"+n+",旗帜分布为:"+ Arrays.deepToString(flag));int size = landAllocate(m,n,flag);System.out.println("此次分配土地,做出贡献的村民中最大会分配到:"+size);}

②landAllocate

private static int landAllocate(int m, int n, int[][] flag) {HashSet<Integer> hashFlag = new HashSet<>();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {hashFlag.add(flag[i][j]);}}hashFlag.remove(0);//去掉没旗子的空地//System.out.println(hashFlag);int area = 0;PriorityQueue<Integer> pqArea = new PriorityQueue<>();for (Integer value : hashFlag) {//System.out.print("当前值为:"+value+" ");area = findPosition(value, m, n, flag);pqArea.add(area);}return pqArea.peek();}

③findPosition

//对于一种旗帜private static int findPosition(Integer value, int m, int n, int[][] flag) {int area = Integer.MAX_VALUE;int TOP = Integer.MAX_VALUE;int DOWN  = Integer.MIN_VALUE;int LEFT = Integer.MAX_VALUE;int RIGHT = Integer.MIN_VALUE;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (flag[i][j] == value){TOP = Math.min(TOP,j);//上边界为最小的jDOWN = Math.max(DOWN,j);//下边界为最大的jLEFT = Math.min(LEFT,i);//左边界为最小的iRIGHT = Math.max(RIGHT,i);//右边界为最大的i}}}//System.out.println("上边界:"+TOP+",下边界:"+DOWN+",左边界:"+LEFT+",右边界:"+RIGHT);if (TOP==DOWN){if (LEFT==RIGHT){area = 1;//上=下,左=右,只有它一个} else if (LEFT<RIGHT) {area = RIGHT-LEFT+1;//横着的一条}}else if (TOP<DOWN){if (RIGHT==LEFT){area = DOWN-TOP+1;//竖着的一条}else if (LEFT<RIGHT){area = (RIGHT-LEFT+1)*(DOWN-TOP+1);}}//System.out.println("当前旗帜占地面积为:"+area);return area;}

三、运行结果

1.运行截图

2.带数据分析运行结果

请输入田地的长宽:
4 4
请输入旗帜分布:
1 9 9 7
0 3 0 6
2 0 0 2
1 0 3 0
[1, 2, 3, 6, 7, 9]
当前值为:1 上边界:0,下边界:0,左边界:0,右边界:3
当前旗帜占地面积为:4
当前值为:2 上边界:0,下边界:3,左边界:2,右边界:2
当前旗帜占地面积为:4
当前值为:3 上边界:1,下边界:2,左边界:1,右边界:3
当前旗帜占地面积为:6
当前值为:6 上边界:3,下边界:3,左边界:1,右边界:1
当前旗帜占地面积为:1
当前值为:7 上边界:3,下边界:3,左边界:0,右边界:0
当前旗帜占地面积为:1
当前值为:9 上边界:1,下边界:2,左边界:0,右边界:0
当前旗帜占地面积为:2
此次分配土地,做出贡献的村民中最大会分配到:1

3.带数据分析完整代码

import java.util.HashSet;
import java.util.PriorityQueue;
import java.util.Scanner;public class test38 {public static void main(String[] args) {/*输入矩阵大小,输入矩阵上的旗帜分布,对不同的旗帜所占面积进行计算*/Scanner sc = new Scanner(System.in);System.out.println("请输入田地的长宽:");int m = sc.nextInt();int n = sc.nextInt();System.out.println("请输入旗帜分布:");int[][] flag = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {flag[i][j] = sc.nextInt();}}//System.out.println("已知田地长为"+m+",宽为"+n+",旗帜分布为:"+ Arrays.deepToString(flag));int size = landAllocate(m,n,flag);System.out.println("此次分配土地,做出贡献的村民中最大会分配到:"+size);}private static int landAllocate(int m, int n, int[][] flag) {HashSet<Integer> hashFlag = new HashSet<>();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {hashFlag.add(flag[i][j]);}}hashFlag.remove(0);//去掉没旗子的空地System.out.println(hashFlag);int area = 0;PriorityQueue<Integer> pqArea = new PriorityQueue<>();for (Integer value : hashFlag) {System.out.print("当前值为:"+value+" ");area = findPosition(value, m, n, flag);pqArea.add(area);}return pqArea.peek();}//对于一种旗帜private static int findPosition(Integer value, int m, int n, int[][] flag) {int area = Integer.MAX_VALUE;int TOP = Integer.MAX_VALUE;int DOWN  = Integer.MIN_VALUE;int LEFT = Integer.MAX_VALUE;int RIGHT = Integer.MIN_VALUE;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (flag[i][j] == value){TOP = Math.min(TOP,j);//上边界为最小的jDOWN = Math.max(DOWN,j);//下边界为最大的jLEFT = Math.min(LEFT,i);//左边界为最小的iRIGHT = Math.max(RIGHT,i);//右边界为最大的i}}}System.out.println("上边界:"+TOP+",下边界:"+DOWN+",左边界:"+LEFT+",右边界:"+RIGHT);if (TOP==DOWN){if (LEFT==RIGHT){area = 1;//上=下,左=右,只有它一个} else if (LEFT<RIGHT) {area = RIGHT-LEFT+1;//横着的一条}}else if (TOP<DOWN){if (RIGHT==LEFT){area = DOWN-TOP+1;//竖着的一条}else if (LEFT<RIGHT){area = (RIGHT-LEFT+1)*(DOWN-TOP+1);}}System.out.println("当前旗帜占地面积为:"+area);return area;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 探索生活服务 API 接口的神奇之处
  • 国风高铁站可视化:传统文化与现代科技的融合
  • Ascend C算子开发(入门)—— 什么是算子?
  • 海外新闻稿发布对区块链项目具有深远的影响
  • .NET WPF 抖动动画
  • 面试官让简述一下elasticsearch
  • 使用 Nginx 部署 Vue.js 项目详解
  • 恺英网络:有业绩,无“游戏”
  • C语言典型例题56
  • 【SQL基础】【leetcode】SQL50题
  • Java算法之插入排序(Insertion Sort)
  • 基于STM32的RFID高速收费系统(论文+源码+实物)
  • Github 2024-08-28 C开源项目日报 Top9
  • 基于python的足球比赛数据及可视化 python 足球预测
  • Unet改进11:在不同位置添加MLCA||轻量级的混合本地信道注意机制
  • Android 控件背景颜色处理
  • es6--symbol
  • JS学习笔记——闭包
  • magento2项目上线注意事项
  • maven工程打包jar以及java jar命令的classpath使用
  • MySQL数据库运维之数据恢复
  • Node + FFmpeg 实现Canvas动画导出视频
  • quasar-framework cnodejs社区
  • react 代码优化(一) ——事件处理
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 机器学习学习笔记一
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 我从编程教室毕业
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #java学习笔记(面向对象)----(未完结)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (C++哈希表01)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (层次遍历)104. 二叉树的最大深度
  • (理论篇)httpmoudle和httphandler一览
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)ObjectiveC 深浅拷贝学习
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET : 在VS2008中计算代码度量值
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET gRPC 和RESTful简单对比
  • .Net Memory Profiler的使用举例
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .Net中wcf服务生成及调用
  • @Bean有哪些属性