1、求n行m列矩阵的a行b列的子矩阵

n, m, a, b = map(int, input().split())
matrix = []
for i in range(n):
    row = list(map(int, input().split()))
    matrix.append(row)
# 枚举所有a×b子矩阵
for start_i in range(n - a + 1):
    for start_j in range(m - b + 1):
        submatrix = []
        for i_offset in range(a):
            # 提取子矩阵的一行
            new_row = matrix[start_i + i_offset][start_j:start_j + b]
            submatrix.append(new_row)
        print(submatrix)

(1)首先输入矩阵与子矩阵的行列n,m和a,b:n,m,a,b=map(int ,input().split())

(2)给原始矩阵赋值:输入n行,每行m个数:

for i in range(n):
    row = list(map(int, input().split()))    #这里输入m个数,不能错
    matrix.append(row)

(3)确定子矩阵的起始行列最大值;

  • 子矩阵的起始行是(n - a + 1):因为最大下标是不包含的,实际子矩阵行最大值n-a,原矩阵行最大值n-1,刚好是a行
  • 子矩阵的起始值和行的理解一致

(4)输入子矩阵的每行:

  • new_row = matrix[start_i + i_offset][start_j:start_j + b]
  • 这里我们再一次体会到了python切片操作的简洁,优美之处。
3 4 2 2
1 2 3 4
5 6 7 8
9 10 11 12
[[1, 2], [5, 6]]
[[2, 3], [6, 7]]
[[3, 4], [7, 8]]
[[5, 6], [9, 10]]
[[6, 7], [10, 11]]
[[7, 8], [11, 12]]

2、求解蓝桥杯(试题)

(此蓝桥杯试题的求解,建立在上题求子矩阵的基础上,增加了每个子矩阵的最值相乘计算及求和运算)

n, m, a, b = map(int, input().split())
matrix = []
sum=0
for i in range(n):
    row = list(map(int, input().split()))
    matrix.append(row)
# 枚举所有a×b子矩阵
for start_i in range(n - a + 1):
    for start_j in range(m - b + 1):
        submatrix = []
        for i_offset in range(a):
            # 提取子矩阵的一行
            new_row = matrix[start_i + i_offset][start_j:start_j + b]
            submatrix.append(new_row)
        mi_n=submatrix[0][0]
        ma_n=submatrix[0][0]
        for i in range(a):
            for j in range(b):
                mi_n=min(mi_n,submatrix[i][j])
                ma_x=max(ma_n,submatrix[i][j])
            sum=(sum+mi_n*ma_x)%998244353
print(sum)
2 3 1 2
1 2 3
4 5 6
58
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐