Introduction
Given the matrix, output the average array matrix where each element represents the average of surrounding neighbors.
Input:
{1, 2, 3, 4},
{6, 7, 8, 9},
{2, 3, 4, 5}
Output:
5 5 6 8
4 4 5 6
6 6 7 8
Explanation
For the entry 7 located at (1, 1)
1 2 3
6 7 8
2 3 4
Sum = 36 and Count = 9
Average = 4
Approach
The approach is to create a sum array and fill it by calculating sum and count from the neighbors.
Code
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApp1
{
class CorruptImage
{
public static void Run()
{
var image = new[,]
{
{1, 2, 3, 4},
{6, 7, 8, 9},
{2, 3, 4, 5}
};
var res = PerformCorruptImage(image);
for (int i = 0; i < res.GetLength(0); i++)
{
for (int j = 0; j < res.GetLength(1); j++)
{
Console.Write(res[i, j] + " ");
}
Console.WriteLine();
}
}
private static readonly int[][] PossibleMoves =
{
new []{-1, 0},
new []{-1, -1},
new []{0, -1},
new []{1, -1},
new []{1, 0},
new []{1, 1},
new []{0, 1},
new []{-1, 1},
};
private const int X = 0;
private const int Y = 1;
private static int[,] PerformCorruptImage(int[,] image)
{
var m = image.GetLength(0);
var n = image.GetLength(1);
var corruptImage = new int[m, n];
for (var i = 0; i < m; i++)
{
for (var j = 0; j < n; j++)
{
var sum = image[i, j];
var count = 0;
foreach (var move in PossibleMoves)
{
var pointX = move[X] + i;
var pointY = move[Y] + j;
if (pointX < 0 || pointY < 0 || pointX >= m || pointY >= n)
{
continue;
}
sum += image[pointX, pointY];
count++;
}
corruptImage[i, j] = sum / count;
}
}
return corruptImage;
}
}
}