包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。
示例 1:
输入:
[[1,1,1],
[1,0,1],
[1,1,1]]
输出:
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]
解释:
对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0
对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0
对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0
收获:二维数组指针的定义和使用。
这道题没有逻辑上的难点,主要是要看懂题目的意思。
int** imageSmoother(int** M, int MSize, int* MColSize, int* returnSize, int** returnColumnSizes){
*returnSize = MSize;
*returnColumnSizes=MColSize;
int **NewM=(int**)malloc(sizeof(int*)*MSize);
for(int i=0;i<MSize;++i)
NewM[i]=(int*)malloc(sizeof(int)*MColSize[i]);
for(int row=0;row<MSize;++row){
for(int col=0;col<MColSize[row];++col){
int num=1,sum=M[row][col];
if(row-1>=0&&col-1>=0){
num++;
sum+=M[row-1][col-1];
}
if(row-1>=0){
num++;
sum+=M[row-1][col];
}
if(row-1>=0&&col+1<MColSize[row-1]){
num++;
sum+=M[row-1][col+1];
}
if(col+1<MColSize[row]){
num++;
sum+=M[row][col+1];
}
if(row+1<MSize&&col+1<MColSize[row+1]){
num++;
sum+=M[row+1][col+1];
}
if(row+1<MSize){
num++;
sum+=M[row+1][col];
}
if(row+1<MSize&&col-1>=0){
num++;
sum+=M[row+1][col-1];
}
if(col-1>=0){
num++;
sum+=M[row][col-1];
}
NewM[row][col]=sum/num;
}
}
return NewM;
}