华为OD机考:OD统一考试D卷+C卷+A卷+B卷+刷题OJ
真题目录:真题目录(D卷 + C卷 + B卷 + A卷) + 考点说明
必刷专栏:最新2024华为OD机试(Java/JS/Py/C/C++)+ OJ
在线OJ :点击立即刷题,模拟真实机考环境
华为OD面试真题精选:华为OD面试真题精选
题目描述
从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。
某天集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡献的村民,请问此次分配土地,做出贡献的村民种最大会分配多大面积?
输入描述
第一行输入 m 和 n,
- m 代表村子的土地的长
- n 代表土地的宽
第二行开始输入地图上的具体标识
输出描述
此次分配土地,做出贡献的村民种最大会分配多大面积
备注
旗子上的数字为1~500,土地边长不超过500
未插旗子的土地用0标识
用例1
输入
3 3
1 0 1
0 0 0
0 1 0
输出
9
说明
土地上的旗子为1,其坐标分别为(0,0),(2,1)以及(0,2),为了覆盖所有旗子,矩阵需要覆盖的横坐标为0和2,纵坐标为0和2,所以面积为9,即(2-0+1)*(2-0+1)= 9
用例2
输入
3 3
1 0 2
0 0 0
0 3 4
输出
1
说明
由于不存在成对的小旗子,故而返回1,即一块土地的面积。
解题思路
-
初始化:
- 读取用户输入的土地的长
m
和宽n
。 - 创建一个二维数组
land[m][n]
来存储土地上每个位置的标识。 - 创建两个二维数组
minPos[501][2]
和maxPos[501][2]
来分别存储每个标识数字的最小和最大位置。数组的大小设为501是因为题目中提到数字的范围是1到500。 - 将
minPos
的每个位置初始化为(m, n)
,maxPos
的每个位置初始化为(-1, -1)
,这是因为我们需要在后续的遍历中通过比较来找到实际的最小和最大值。
- 读取用户输入的土地的长
-
遍历土地:
- 通过双层循环遍历土地上的每个位置
(i, j)
。 - 对于每个位置的数字
num
,如果num
不是0,更新
- 通过双层循环遍历土地上的每个位置