保留原图,使用中心与四邻域五个像素的四舍五入平均更新内部像素。
OJ: noi_openjudge
题目 ID: ch0108-13
难度:入门
标签:矩阵模拟python
日期: 2026-07-30 23:01
题意
模糊图像:边缘不变,内部像素取自身与上下左右原值的平均并四舍五入。
思路
新值必须全由原图计算,所以复制一份 blurred 保存结果。非负整数除以 (total + 2) // 5。
代码
cpp
#include <cstdio>
#include <cstring>
int n,m;
int a[200][200];
int b[200][200];
void init(){
scanf("%d%d",&n,&m);
int i,j;
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
scanf("%d",&a[i][j]);
b[i][j] = a[i][j];
}
}
}
int calc(int x,int y){
int fx[4][2] = { 1,0, 0,1, -1,0, 0,-1 };
int i;
int sum = a[x][y];
for (i=0;i<4;i++){
int nx = x+fx[i][0];
int ny = y+fx[i][1];
sum += a[nx][ny];
}
return (int)(sum*1.0 / 5+0.5);
}
int main(){
init();
int i,j;
for (i=2;i<n;i++){
for (j=2;j<m;j++){
b[i][j] = calc(i, j);
}
}
for (i=1;i<=n;i++){
for (j=1;j<=m;j++)
printf("%d ",b[i][j]);
printf("\n");
}
return 0;
}复杂度
总结
Python代码
python
row_count, column_count = map(int, input().split())
image = [list(map(int, input().split())) for _ in range(row_count)]
blurred = [row[:] for row in image]
for row in range(1, row_count - 1):
for column in range(1, column_count - 1):
total = image[row][column] + image[row - 1][column] + image[row + 1][column] + image[row][column - 1] + image[row][column + 1]
blurred[row][column] = (total + 2) // 5
for row in blurred:
print(*row)C++代码
cpp
#include <cstdio>
#include <cstring>
int n,m;
int a[200][200];
int b[200][200];
void init(){
scanf("%d%d",&n,&m);
int i,j;
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
scanf("%d",&a[i][j]);
b[i][j] = a[i][j];
}
}
}
int calc(int x,int y){
int fx[4][2] = { 1,0, 0,1, -1,0, 0,-1 };
int i;
int sum = a[x][y];
for (i=0;i<4;i++){
int nx = x+fx[i][0];
int ny = y+fx[i][1];
sum += a[nx][ny];
}
return (int)(sum*1.0 / 5+0.5);
}
int main(){
init();
int i,j;
for (i=2;i<n;i++){
for (j=2;j<m;j++){
b[i][j] = calc(i, j);
}
}
for (i=1;i<=n;i++){
for (j=1;j<=m;j++)
printf("%d ",b[i][j]);
printf("\n");
}
return 0;
}复杂度
时间和空间复杂度均为
总结
邻域更新题不要原地写入,否则后续像素会读到本轮新值。