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()
相关推荐
CodeClimb13 小时前
【华为OD-E卷-寻找密码 100分(python、java、c++、js、c)】
java·python·华为od
枫叶丹419 小时前
【HarmonyOS之旅】HarmonyOS开发基础知识(三)
华为od·华为·华为云·harmonyos
CodeClimb1 天前
【华为OD-E卷-简单的自动曝光 100分(python、java、c++、js、c)】
java·python·华为od
CodeClimb2 天前
【华为OD-E卷-最左侧冗余覆盖子串 100分(python、java、c++、js、c)】
java·python·华为od
星海拾遗2 天前
华为OD --- TLV解码
华为od
arnold662 天前
华为OD E卷(100分)31-敏感字段加密
算法·华为od
CodeClimb2 天前
【华为OD-E卷-开心消消乐 100分(python、java、c++、js、c)】
java·python·华为od
CodeClimb2 天前
【华为OD-E卷-预订酒店 100分(python、java、c++、js、c)】
java·python·华为od
arnold663 天前
华为OD E卷(100分)25-整数对最小和
算法·华为od
CodeClimb3 天前
【华为OD-E卷-寻找关键钥匙 100分(python、java、c++、js、c)】
java·python·华为od