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()
相关推荐
我是华为OD~HR~栗栗呀2 天前
23届考研-Java面经(华为OD)
java·c++·python·华为od·华为·面试
我是华为OD~HR~栗栗呀3 天前
24届-Python面经(华为OD)
java·前端·c++·python·华为od·华为·面试
Tony_yitao3 天前
符号运算(华为OD)
java·算法·华为od
smallnetter5 天前
华为OD机试C卷 - 分披萨 - 贪心 DFS - (Java & C++ & JavaScript & Python)
华为od·贪心算法·dfs
smallnetter8 天前
华为OD机试C卷 - 分苹果 - 二进制 - (Java & C++ & JavaScript & Python)
算法·华为od
我是华为OD~HR~栗栗呀10 天前
Java面经(22届考研-华oD)
java·后端·python·华为od·华为
我是华为OD~HR~栗栗呀16 天前
前端面经-高级开发(华为od)
java·前端·后端·python·华为od·华为·面试
我是华为OD~HR~栗栗呀16 天前
测试转C++开发面经(华为OD)
java·c++·后端·python·华为od·华为·面试
闭着眼睛学算法17 天前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
我是华为OD~HR~栗栗呀19 天前
20届-高级开发(华为oD)-Java面经
java·c++·后端·python·华为od·华为