n, m = map(int, input().split())
image = []
for _ in range(n):
image.append(list(map(int, input().split())))
result = [[0] * m for _ in range(n)]
for i in range(n):
for j in range(m):
# 用于存储以当前像素为中心的3x3区域内像素值的总和
total = 0
# 用于统计以当前像素为中心的3x3区域内的像素个数
count = 0
# 遍历以当前像素为中心的3x3区域
for x in range(max(0, i - 1), min(n, i + 2)):
for y in range(max(0, j - 1), min(m, j + 2)):
total += image[x][y]
count += 1
# 计算当前像素模糊后的灰度值,取下整
result[i][j] = total // count
for row in result:
for num in row:
print(num, end=' ')
print()
例题 P156 螺旋矩阵
对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
n, m = map(int, input().split())
r, c = map(int, input().split())
matrix = [[0] * m for _ in range(n)]
num = 1
top, bottom, left, right = 0, n - 1, 0, m - 1
while num <= n * m:
# 从左到右
for i in range(left, right + 1):
matrix[top][i] = num
num += 1
top += 1
if num > n * m:
break
# 从上到下
for i in range(top, bottom + 1):
matrix[i][right] = num
num += 1
right -= 1
if num > n * m:
break
# 从右到左
for i in range(right, left - 1, -1):
matrix[bottom][i] = num
num += 1
bottom -= 1
if num > n * m:
break
# 从下到上
for i in range(bottom, top - 1, -1):
matrix[i][left] = num
num += 1
left += 1
print(matrix[r - 1][c - 1])
N = int(input())
N_all_max = 1
for begin in range(1, N + 1):
# 初始值
current = begin
N_max = begin
# 停止时
while current != 1:
# 偶数
if current % 2 == 0:
current = current // 2
# 奇数
else:
current = current * 3 + 1
# 找每个数的最大值,对比N_max
if current > N_max:
N_max = current
# 找整体的最大值,对比N_all_max
if N_max > N_all_max:
N_all_max = N_max
print(N_all_max)
N = int(input())
# 储存已及算过的数字及其最大值
memory={}
N_all_max = 1
for begin in range(1, N + 1):
current = begin
N_max = begin
while current != 1:
# 排除
if current in memory:
N_max=max(N_max,memory[current])
break
if current % 2 == 0:
current = current // 2
else:
current = current * 3 + 1
if current > N_max:
N_max = current
if N_max > N_all_max:
N_all_max = N_max
# 记录
memory[begin]=N_max
print(N_all_max)
对于每个要处理的起始数字 begin,我们将 pass 初始化为 begin - 1。pass 作为一个界限,用于判断在当前 begin 的变换过程中得到的新数字是否已经在之前处理过。当 current 小于等于 pass 时,说明这个数字在之前处理 1 到 begin - 1 这些数字的过程中已经被处理过了,其变换过程中的最大值也已经被记录,所以无需再对这个数字继续进行变换,直接结束当前 begin 的变换过程。
python复制代码
N = int(input())
N_all_max = 0
for begin in range(1, N + 1):
current = begin
# 记录当前起始数减 1 的值
n_pass = begin - 1
# 当 n 不等于 1 且大于起始数减 1 时进行循环
while current != 1 and current > n_pass:
# 如果当前的 n 大于之前记录的最大值,更新最大值
if current > N_all_max:
N_all_max = current
if current % 2 == 0:
current = current // 2
else:
current = current * 3 + 1
print(N_all_max)