一、题目描述
从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。
某天集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡献的村民,请问此次分配土地,做出贡献的村民种最大会分配多大面积?
输入描述
第一行输入 m 和 n,
m 代表村子的土地的长
n 代表土地的宽
第二行开始输入地图上的具体标识
3 3
1 0 1
0 0 0
0 0 1
输出描述
此次分配土地,做出贡献的村民种最大会分配多大面积
9
二、解题思路
矩形面积为长乘宽,则需要用max_x,min_x,max_y,min_y,max-min则分别表示出长和宽的长度。
其中细节:
1.二维数组用嵌套列表表示
2.旗子上的数字默认为1-9,则第一层循环有了
3.遍历二维数组需要再两层循环
4.对于每次数字循环结束后,更新最大面积
5.数字循环全部结束后,输出最大面积
三、详细代码(不符合1-500的代码)
m, n = map(int, input().split())
max_x, max_y, min_x, min_y = -1, -1, m, n
land = []
# 列表的嵌套
for _ in range(m): # '_'也是变量,但是只表示循环次数,不在循环中起作用
land.append(list(map(int, input().split())))
land_area = 1 # 初始土地面积为1
for num in range(1, 10): # 默认旗子上的数字为1-9,这是有问题的,不符合题意1-500
change = False # 数字是否相同,相同则改变
# 两次循环遍历二维数组
for i in range(m):
for j in range(n):
if land[i][j] == num:
change = True
# x代表行,y代表列
max_x = max(max_x, i)
max_y = max(max_y, j)
min_x = min(min_x, i)
min_y = min(min_x, j)
# 改变后则更新最大面积
if change:
area = (max_x - min_x + 1) * (max_y - min_y + 1)
land_area = max(land_area, area)
print(land_area)
符合1-500的修改代码可参考:【独家OD2023C卷真题】20天拿下华为OD笔试【贪心】2023C-分配土地最大面积【欧弟算法】全网注释最详细分类最全的华为OD真题题解_华为od题库c及答案-CSDN博客