题目描述:
给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:
1.四周最外侧的像素点灰度值不变;
2.中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)
输入描述:
第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1<=n<=100,1<=m<=100.接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间
输出描述:
n行,每行m个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开
用例输入:
4 5
100 0 100 0 50
50 100 200 0 0
50 50 100 100 200
100 100 50 50 100
用例输出:
100 0 100 0 50
50 80 100 60 0
50 80 100 90 200
100 100 50 50 100
解题思路:
此题难度也不是很高,最主要的就是对二维数组的运用。题目也已经给出了很明确的提示:n行,每行m个整数。所以我们定义一个二维数组来存放数值即可。需要注意的是,如果我们只定义了一个二维数组的话,按照题目要求,新灰度值会代替原灰度值,但新灰度值是用原灰度值计算得来的,这样就会出现:已经算出的新灰度值会影响还没有算出的新灰度值,所以我们要定义另一个数组,存放一样的数据,以便我们进行计算,然后将计算完的新灰度值放回原数组中,最后输出就好。
参考代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=100;
int a[N][N];
int b[N][N];
main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
b[i][j] = a[i][j];
}
}
for(int i=2;i<n;i++){
for(int j=2;j<m;j++){
b[i][j] = (a[i][j]+a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1])/5;
}
}
cout<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<b[i][j]<<" ";
}
cout<<endl;
}
}
额解题思路的那个地方我真的尽力来解释了,不明白的可以提问,我看到后都会解释