Python :求解蓝桥杯2023年第十四届省赛大学A组试题F
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