欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 旗帜分田(华为od机考题)

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

2025/5/22 8:57:01 来源:https://blog.csdn.net/qq_57223586/article/details/141640438  浏览:    关键词:旗帜分田(华为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;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词