旗帜分田(华为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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1522585.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MMsegmentation与MMdeploy简单使用

最近涉及到了图像分割的任务&#xff0c;于是拿来写下博客加深下使用。 MMsegmentation与MMdeploy的环境配置暂不做讲解&#xff0c;在官网和其他博客中有很多说明。 MMdeploy主要是把pt转为 onnx_int8的情况。 MMsegmentation环境配置可以参考 : 安装与配置MMSegmentation 目录…

DriveLM的baseline复现

DriveLM是一篇很有意思的工作&#xff0c;把自动驾驶跟MLLM结合到一起了&#xff0c;实现端到端的决策。 Repo&#xff1a;https://github.com/OpenDriveLab/DriveLM 该工作是基于nuScenes数据集做的&#xff0c;官方paper里给出了数据的具体构建方式&#xff0c;感兴趣的可以…

[HZNUCTF 2023 preliminary]easyAPK-快坚持不下去的第三天

第一做安卓题&#xff0c;前提jadx,java环境&#xff0c;模拟器&#xff0c;我配了好久&#xff0c; 这段代码实现了一个简单的登录界面&#xff0c;用户需要输入用户名和密码。用户名和密码会与预设的硬编码值进行比较&#xff0c;登录成功后会启动另一个 Activity。如果密码错…

★ 算法OJ题 ★ 力扣11 - 盛水最多的容器

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起做一道双指针算法题--盛水最多的容器~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 解法1&#xff1a;暴力枚举 …

Mysql基础练习题 620.有趣的电影 (力扣)

620.编写解决方案&#xff0c;找出所有影片描述为 非 boring (不无聊) 的并且 id 为奇数 的影片,返回结果按 rating 降序排列 题目链接&#xff1a; https://leetcode.cn/problems/not-boring-movies/ 建表插入数据&#xff1a; Create table If Not Exists cinema (id int…

【云原生系列之SkyWalking的部署】

1、分布式链路追踪 1.1概念 在较大的web集群和微服务环境中&#xff0c;客户端的一次请求需要经过不同的模块&#xff0c;多个不同中间件&#xff0c;多个不同机器一起相互协作才能处理完成客户端的请求&#xff0c;而在这一系列的请求过程之中,处理流程可能是串行执行,也可能…

论斜率优化dp

论斜率优化dp 1问题2暴力算法-线性dp3斜率优化线性dp4后记 1问题 如下图 看到这题&#xff0c;题面很复杂 其实可以转化为如下问题 有 n n n个任务&#xff0c;排成一个有序序列&#xff0c;我们要解决这些任务 总费用是每一个任务的完成时间乘以费用系数求和 每个任务之前…

sessionstorage和localstorage的使用与区别

sessionstorage和localstorage的使用与区别 localStorage和sessionStorage一样都是用来存储客户端临时信息的对象。他们均只能存储字符串类型的对象&#xff08;虽然规范中可以存储其他原生类型的对象&#xff0c;但是目前为止没有浏览器对其进行实现&#xff09;。 localStor…

Hadoop 下载

下载法一&#xff1a;官方下载 hadoop官网 1.选择要下载的版本&#xff0c;这里我以3.4.0为例进行说明&#xff1b; 2.跳转后&#xff0c;选择对应系统架构的&#xff0c;进行下载&#xff1b; 下载法二&#xff1a;国内镜像源下载 1.阿里云 这里我以mac m1为案例&#x…

Linux日志-wtmp日志

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具&#xff0c;它们可以帮助管理员监视系统状态、调查问题以及了解系统运行…

【保姆级教程】如何在Win11上搭建一个GPU环境

CUDA和CUDNN安装 CUDA安装 下载对应cuda环境 下载链接&#xff1a;https://developer.nvidia.com/cuda-downloads&#xff0c;图片下载的是 cuda_12.6.1_560.94_windows.exe 然后一路安装即可&#xff1a; 安装路径如下&#xff1a; CUDNN安装 打开cuDNN下载页面 解压后…

嵌入式基础知识-RS232通信协议电路与代码最全分析

1.RS232基本概念 RS232是异步通信&#xff0c;全双工传输&#xff08;异步通信就是无时钟CLK信号&#xff0c;全双工就是能同时收发数据&#xff09;。采用负逻辑传送&#xff0c;规定逻辑“1”的电平为-5V~-15 V&#xff0c;逻辑“0”的电平为5 V&#xff5e;15 V。选用该电气…

阻塞队列-单锁实现

使用阻塞队列 当我们多个线程下 对 一个队列进行操作&#xff0c;队列满了的情况下&#xff0c;其他线程再次 offer&#xff0c;会一直阻塞等待 对一个队列进行出队操作的时候&#xff0c;队列空的情况下&#xff0c;会一直阻塞等待删除&#xff0c;直到队列有元素的时候&a…

C++刷怪笼(2)类和对象的探索-上

1.前言 了解完C的一些入门干货之后&#xff0c;我们来对C的第一个重点就行学习——那就是类和对象&#xff0c;该重点我们分为三篇文章进行学习&#xff0c;请大家跟紧我的脚步&#xff0c;认真学知识哦~ 2.正文——类和对象 2.1类的定义 2.2.1类的定义格式 • class为定义…

echarts遍历区域折线图,单线和多线

// 单线折线图drawonelineCharts(){var echarts require("echarts");var lineCharts document.getElementsByClassName(lineChart); // 对应地使用ByClassNamethis.linecolor[#01FFD4,#1C70DD,#01FFD4,#1C70DD,#01FFD4,#1C70DD]for(var i 0;i < lineCharts.len…

内核头文件, makfile 传参

1 内核头文件&#xff0c;主要指的是&#xff0c; 在板卡上的系统上直接 &#xff0c;编译驱动模块&#xff0c;而不是在虚拟机的内核源码中 去编译内核模块。 2 makefile 传参 &#xff0c;指的是&#xff0c; 内核模块使用 makfile 定义的宏定义。 首先是 关于 在普通的makef…

ubuntu24安装cuda和cudnn

一、安装cuda 确保显卡驱动正确安装 终端输入&#xff1a; nvidia-smi显示下面结果&#xff0c;说明显卡驱动安装正常&#xff0c;可以进行下一步 1.去官网下载CUDA&#xff0c;需要注册账号下载 https://developer.nvidia.com/cuda-toolkit-archive由于我们显卡支持12.2&…

网络通信特刊合集(二)——CMC特刊推荐

特刊征稿 01 特刊名称&#xff1a; Security and Privacy for Blockchain-empowered Internet of Things 截止时间&#xff1a; 提交截止日期 2024 年 10 月 30 日 目标及范围&#xff1a; 本期特刊旨在探讨最近的进展&#xff0c;以解决在区块链授权的物联网中与安全和…

一文带你深度了解FreeRTOS——计数型信号量

本文记录FreeRTOS的计数型信号量知识&#xff0c;希望我的分享对你有所帮助&#xff01; 目录 一、计数型信号量简介 二、创建计数型信号量 1、动态创建计数型信号量 2、静态创建计数型信号量 三、结语 一、计数型信号量简介 计数型信号量在FreeRTOS中用于管理对共享资…

拥有这些AI绘画网站,让你轻松告别手绘时代!

在这个充满无限可能的数字世界里&#xff0c;AI 绘画动漫网站已经成为了许多艺术家和设计师的新宠。从手绘时代的岁月如歌&#xff0c;到今天科技的飞速发展&#xff0c;我们已经可以用AI技术创作出令人惊叹的艺术作品&#xff0c;打开了全新的创作空间。接下来&#xff0c;就让…