2023华为od机试C卷【分配土地】Python实现


思路:

我们可以用哈希结构,此题适合用字典,键为出现的非零数字,值为列表,列表为【minrow,maxrow,minrol,maxrol]

python 复制代码
import sys
def main():
    m,n = map(int,input().split())
    rects = {}
    for i in range(m):
        nums = [int(i) for i in input().split()]
        for j in range(n):
            if nums[j] > 0:
                if nums[j] not in rects:
                    rects[nums[j]]=[sys.maxsize,-sys.maxsize,sys.maxsize,-sys.maxsize]
                rects[nums[j]][0] = min(rects[nums[j]][0],i)
                rects[nums[j]][1] = max(rects[nums[j]][1],i)
                rects[nums[j]][2] = min(rects[nums[j]][2],j)
                rects[nums[j]][3] = max(rects[nums[j]][3],j)
    print(rects)
    #MaxArea = 0
    for key,value in rects.items():
        minrow = value[0]
        maxrow = value[1]
        mincol = value[2]
        maxcol = value[3]
        area = (maxrow-minrow+1)*(maxcol-mincol+1)
        print("{%d}的矩阵面积为:{%d}"%(key,area))
        
if __name__ == "__main__":
    main()

这段代码的目的是读取一个矩阵,并计算每个正整数的矩阵区域的面积。下面是对代码的详细解释:

代码结构

  1. 导入模块:

    python 复制代码
    import sys

    这行代码导入了 sys 模块,主要用来获取 sys.maxsize,这是 Python 中可以使用的最大整数值。

  2. 主函数:

    python 复制代码
    def main():
  3. 输入矩阵的维度:

    python 复制代码
    m, n = map(int, input().split())

    mn 分别表示矩阵的行数和列数。通过 input() 接收用户输入,并用空格分隔。

  4. 初始化字典:

    python 复制代码
    rects = {}

    rects 是一个字典,用于存储每个正整数在矩阵中的最小和最大行列边界。

  5. 读取矩阵数据:

    python 复制代码
    for i in range(m):
        nums = [int(i) for i in input().split()]

    在循环中逐行读取矩阵。nums 是当前行的整数列表。

  6. 记录每个正整数的边界:

    python 复制代码
    for j in range(n):
        if nums[j] > 0:
            if nums[j] not in rects:
                rects[nums[j]] = [sys.maxsize, -sys.maxsize, sys.maxsize, -sys.maxsize]
            rects[nums[j]][0] = min(rects[nums[j]][0], i)
            rects[nums[j]][1] = max(rects[nums[j]][1], i)
            rects[nums[j]][2] = min(rects[nums[j]][2], j)
            rects[nums[j]][3] = max(rects[nums[j]][3], j)
    • 对于每一个正整数 nums[j]:
      • 如果它不在 rects 字典中,则初始化边界值。
      • 更新矩阵的上下左右边界:
        • rects[nums[j]][0] 表示最小行数。
        • rects[nums[j]][1] 表示最大行数。
        • rects[nums[j]][2] 表示最小列数。
        • rects[nums[j]][3] 表示最大列数。
  7. 打印矩阵的边界字典 (调试用):

    python 复制代码
    print(rects)
  8. 计算并打印每个正整数的矩阵面积:

    python 复制代码
    for key, value in rects.items():
        minrow = value[0]
        maxrow = value[1]
        mincol = value[2]
        maxcol = value[3]
        area = (maxrow - minrow + 1) * (maxcol - mincol + 1)
        print("{%d}的矩阵面积为:{%d}" % (key, area))
    • 对于每个正整数,计算矩阵区域的面积,使用公式 (maxrow - minrow + 1) * (maxcol - mincol + 1)。这里加1是因为需要计算的是包含的行和列的数量。
  9. 主程序入口:

    python 复制代码
    if __name__ == "__main__":
        main()

    确保该脚本从这里开始运行。

    下面是运行的例子:

总结

这段代码读取一个矩阵,分析每个正整数在矩阵中的位置,并计算出其矩阵面积。使用字典来存储每个正整数的最小和最大行列边界,最终通过计算边界差值得到面积。

理解了,我们可以改写成符合题意要求的代码

python 复制代码
import sys
def main():
    m,n = map(int,input().split())
    rects = {}
    for i in range(m):
        nums = [int(i) for i in input().split()]
        for j in range(n):
            if nums[j] > 0:
                if nums[j] not in rects:
                    rects[nums[j]]=[sys.maxsize,-sys.maxsize,sys.maxsize,-sys.maxsize]
                rects[nums[j]][0] = min(rects[nums[j]][0],i)
                rects[nums[j]][1] = max(rects[nums[j]][1],i)
                rects[nums[j]][2] = min(rects[nums[j]][2],j)
                rects[nums[j]][3] = max(rects[nums[j]][3],j)
    MaxArea = 0
    for value in rects.values():
        minrow,maxrow,mincol,maxcol = value
        area = (maxrow-minrow+1)*(maxcol-mincol+1)
        MaxArea = max(area,MaxArea)
    print(MaxArea)
        
        
if __name__ == "__main__":
    main()
相关推荐
DC妙妙屋19 小时前
11.19.2024刷华为OD
数据结构·链表·华为od
郝晨妤1 天前
鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)
android·ios·华为od·华为·华为云·harmonyos·鸿蒙
TangKenny4 天前
华为刷题笔记--题目索引
笔记·华为od·华为·华为od机试
哪 吒11 天前
华为OD机试 - 考古问题 - 回溯、全排列问题(Python/JS/C/C++ 2024 C卷 200分)
javascript·python·华为od
傲娇尧12 天前
华为OD技术一面手撕题
华为od
Amor风信子13 天前
华为OD机试真题---计算最接近的数
java·开发语言·数据结构·算法·华为od
哪 吒17 天前
华为OD机试 - 无重复字符的元素长度乘积的最大值(Python/JS/C/C++ 2024 C卷 100分)
javascript·python·华为od
哪 吒18 天前
华为OD机试 - 打印机队列 - 优先队列(Java 2024 E卷 200分)
java·开发语言·华为od·优先队列
DC妙妙屋21 天前
10.31.2024刷华为OD C题型
c语言·开发语言·华为od
TangKenny22 天前
计算堆栈中的剩余数字
java·算法·游戏·华为od·华为