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

旗帜分田(华为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);//上边界为最小的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.kler.cn/news/288562.html

相关文章:

  • 用ChatGPT提升论文质量:改进语法、用词和行文的有效方法
  • WinForm技巧之自定义条件
  • 1688精选货源API接口升级||1688选品
  • 数学基础 -- 线性代数之行阶梯形
  • JavaScript高级进阶(一)
  • SprinBoot+Vue停车场管理微信小程序的设计与实现
  • C# 上位机开发指南:高效学习建议
  • 力扣刷题--LCP17.速算机器人【简单】
  • ChatGPT 3.5/4新手使用手册(附:案例)
  • LabVIEW电机多次调用
  • 基于RAG多层次的多代理架构来处理时序任务
  • Vue3中 defineProps 与 defineEmits 基本使用
  • hive中datediff函数介绍
  • 二百五十九、Java——采集Kafka数据,解析成一条条数据,写入另一Kafka中(一般JSON)
  • verilog 中的for循环用法
  • 深度学习(一)-感知机+神经网络+激活函数
  • Qt 实现部件或者窗口(QWidget)透明效果和其他特殊效果
  • 深度解析TCP与UDP协议
  • 每日一题——第七十九题
  • How to install mysql 5.7 with podman in Ubuntu 24.04
  • 三十二、初识Gin框架
  • chunqiude
  • JS设计模式之“幽灵工厂” - 抽象工厂模式
  • 【贪心算法】区间类算法题(整数替换、俄罗斯套娃、重构字符串等、C++)
  • OpenAI API: Can I remove the line break from the response with a parameter?
  • OpenCVSharp中基本绘图函数
  • Qt Dialog退出事件
  • Golang使用Quic-Go开源库实现Quic客户端和服务端
  • Unity接入飞行遥杆外设
  • 【BES2500x系列 -- RTX5操作系统】Battery模块 -- 创建电池检测定时器 --(十五)