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

news2024/11/14 13:34:01

一、题目

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);//上边界为最小的j
                    DOWN = Math.max(DOWN,j);//下边界为最大的j
                    LEFT = Math.min(LEFT,i);//左边界为最小的i
                    RIGHT = 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);//上边界为最小的j
                    DOWN = Math.max(DOWN,j);//下边界为最大的j
                    LEFT = Math.min(LEFT,i);//左边界为最小的i
                    RIGHT = 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.coloradmin.cn/o/2086772.html

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

相关文章

DevEco Studio5 新建项目

Deveco Studio安装结束之后&#xff0c;开始新建一个项目&#xff1a; 1.点击Create Project新建项目 2.选择空的项目–>点击next 3.配置项目信息–>点击Finish 4.进入项目 6.右上方目前处于No Devices(无设备)状态–>点击下拉三角–>点击Devide Manager管理设…

Life long learning

现象&#xff1a;一个model进行multi-task learning做的还可以&#xff0c;说明模型是可以同时学会多个任务的&#xff0c;但是如果训练过程是1个task 1个task的顺序进行&#xff0c;模型就会发生灾难性的遗忘现象&#xff0c;只会做刚学完的task。 目标&#xff1a;让模型不要…

94.WEB渗透测试-信息收集-Google语法(8)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;93.WEB渗透测试-信息收集-Google语法&#xff08;7&#xff09; • Filetype • Filetype…

二叉树前序,中序,后序非递归遍历(Java)

1. 思路&#xff1a; 首先创建一个栈和顺序表&#xff0c;按照根左右的前序遍历顺序去遍历这棵树&#xff0c;一直往左孩子方向遍历&#xff0c;每遍历到一个结点就入栈并且加入到顺序表里&#xff0c;如果没有左孩子了&#xff0c;就拿出栈顶元素&#xff0c;看它是否有右孩子…

2024年牛客网最全1000道Java中高级面试题包含答案详解,看完稳了

我相信大多 Java 开发的程序员或多或少经历过 BAT 一些大厂的面试&#xff0c;也清楚一线互联网大厂 Java 面试是有一定难度的&#xff0c;小编经历过多次面试&#xff0c;有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&#xff…

JavaScript进阶指南之Event Loop

JavaScript进阶指南之Event Loop 引言 简要介绍主题&#xff1a; 在JavaScript的世界中&#xff0c;Event Loop是一个核心机制&#xff0c;它决定了代码的执行顺序&#xff0c;尤其是在处理异步任务时。对于初学者来说&#xff0c;理解Event Loop的工作原理是迈向JavaScript进…

设计模式篇(DesignPattern - 结构型模式)(持续更新迭代)

目录 模式一&#xff1a;适配器模式 一、简介 二、案例一&#xff08;充电器问题&#xff09; 1. 类适配器 2. 对象适配器 3. 接口适配器 三、应用 1. HandlerAdapter&#xff08;SpringMVC 源码应用&#xff09; 四、总结 模式二&#xff1a;桥接模式 一、简介 1.…

20240829版图的层次

1 最常用 Esc&#xff1a;取消操作 i&#xff1a;插入元件版图 c&#xff1a;复制 m&#xff1a;移动 u&#xff1a;撤销上一步操作 q&#xff1a;查看属性 f&#xff1a;全局视图 e&#xff1a;显示设置&#xff08;图层、栅格、走线模式等&#xff09; r&#xff1a;矩形填充…

纷享AI PaaS 助力打造企业级Al专属应用

纷享AIPaaS助力打造企业级Al专属应用 纷享销客人工智能(AI)在多个关键领域下的应用&#xff0c;诸如营销内容生成、线索预测评分、客服工作台助手等&#xff0c;均是通过AIPaaS平台来定制实现。 纷享销客AIPaaS平台通过AgentBuilder和ModelBuilder为上层的场景应用提供底层能…

005-CircuitBreaker断路器-Resilience4J

文章目录 1 CircuitBreaker1.1 实现原理1.2 一句话 2 Resilience4J2.1 是什么2.2 能干嘛2.3 怎么用 3 熔断(CircuitBreaker)(服务熔断服务降级)3.1 断路器三大状态3.2断路器3大状态之前的转换3.3断路器所有配置参数参考3.4 熔断降级案例需求说明3.5 COUNT_BASED(计数的滑动窗口…

6个一键生成原创文案实用方法,亲测好用!

在当下的这个自媒体时代&#xff0c;文案创作的需求日益增长。无论是用于社交媒体、广告宣传还是各种内容创作&#xff0c;优质的原创文案都能起到关键作用。但有时候&#xff0c;我们在创作文案的过程中可能会陷入灵感枯竭的困境。但别担心&#xff0c;这里有6个一键生成原创文…

iOS App快捷指令(App Intents)在系统搜索服务中注册shortcuts

iOS App快捷指令(App Intents)在系统搜索服务中注册shortcuts 前言效果图实现快捷指令1. 定义AppIntent2. 定义`AppShortcutsProvider使用参考资料前言 网上很多资料都是关于IntentsExtension的,但是IntentsExtension只能实现快捷指令的添加,无法在系统搜索服务中搜索到。…

嵌入式day36

数据库 专业存储数据、大量数据 数组、链表、变量---->内存&#xff1a;程序运行结束、掉电数据丢失 文件---->硬盘&#xff1a;程序运行结束、掉电数据不丢失 数据库---->硬盘 数据库文件与普通文件区别&#xff1a; 1.普通文件对数据管理&#xff08;增删改查…

提前还房贷结果失败了该怎么办?需要注意哪些?怎么做更顺利?

提前还房贷结果失败了&#xff0c;该怎么办&#xff1f; 1. 满足条件再申请&#xff1a;部分银行对提前还款设有一定的条件和限制&#xff0c;例如需要提前预约&#xff0c;对已还款时间和还款金额也有具体的要求。如果借款人未能满足这些条件&#xff0c;提前还款的申请可能会…

0829作业+思维导图

一、作业 代码&#xff1a; #include <iostream> #include <string.h> #include <stdio.h> using namespace std; class Mystring { public://无参构造Mystring():size(10){str new char[size];cout<<"无参构造完成"<<endl;}//有参…

【Java】—— Java面向对象进阶:Java银行账户管理系统设计与实现

目录 1. 账户类&#xff08;Account&#xff09; 2. 客户类&#xff08;Customer&#xff09; 3. 银行类&#xff08;Bank&#xff09; 4. 测试类&#xff08;BankTest&#xff09; 运行结果 在今天的博文中&#xff0c;我们将一起探讨一个简单的Java银行账户管理系统的设…

【JavaEE初阶】HTTP请求(Request)

&#x1f4d5;引言 HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成 本片文章将从以下四个方面对HTTP请求报文进行解析 URL方法请求报头正文 &#x1f384;认识URL 我们先抓一个包来看一下URL在包里面的位置 平时我们俗称的 “网址” 其实就是说的 URL (…

数据库——开篇

一、数据存储方式 1、内存存数据&#xff1a;当程序运行结束&#xff0c;掉电&#xff0c;数据丢失。&#xff08;数组、链表、变量等&#xff09; 2、硬盘存数据&#xff1a;程序运行结束&#xff0c;掉电&#xff0c;数据不丢失。 &#xff08;1&#xff09;文件&#xff…

盘点2024年wind录屏好用工具,这四款打工人常备!

嘿&#xff0c;朋友们&#xff0c;今天我要给大家分享一下关于Windows自带录屏系统以及几款热门录屏软件的使用方法和体验感。录屏功能对于很多小伙伴来说可是个宝贝&#xff0c;无论你是要录制游戏过程、制作教学视频还是记录生活小确幸&#xff0c;都能派上用场。接下来&…

HAL库:串口 不定长数据接收 + 循环收发缓冲区 + 空闲中断 收发数据

目录 HAL库&#xff1a;不定长数据接收 循环收发缓冲区 空闲中断 收发数据 串口&#xff1a;多指针定位收发循环使用缓冲区设计 文件架构&#xff1a; 程序部分大体思路 Uart.h Uart.c stm32fxx_It.c main.c HAL库&#xff1a;不定长数据接收 循环收发缓冲区 空闲中…