#include <iostream>

const unsigned dim = 3;
typedef int array_type [dim][dim];

void average(array_type& dest, const array_type& src)
{
    // corners:
    dest[  0  ][  0  ] = 
		(src[  0  ][  0  ] + src[  0  ][  1  ] + src[  1  ][  0  ] + src[  1  ][  1  ])/4;
    dest[dim-1][  0  ] = 
		(src[dim-1][  0  ] + src[dim-2][  0  ] + src[dim-1][  1  ] + src[dim-2][  1  ])/4;
    dest[  0  ][dim-1] = 
		(src[  0  ][dim-1] + src[  1  ][dim-1] + src[  0  ][dim-2] + src[  1  ][dim-2])/4;
    dest[dim-1][dim-1] = 
		(src[dim-1][dim-1] + src[dim-2][dim-1] + src[dim-1][dim-2] + src[dim-2][dim-2])/4;

    // top, bottom, and sides:
    for (unsigned i = 1; i < dim - 1; ++i)
    {
        const unsigned j = dim - 1;

        dest[0][i] = 
			(src[0][i-1] + src[0][i] + src[0][i+1] + src[ 1 ][i-1] + src[ 1 ][i] + src[ 1 ][i+1])/6;
        dest[j][i] = 
			(src[j][i-1] + src[j][i] + src[j][i+1] + src[j-1][i-1] + src[j-1][i] + src[j-1][i+1])/6;

        dest[i][0] = 
			(src[i-1][0] + src[i][0] + src[i+1][0] + src[i-1][ 1 ] + src[i][ 1 ] + src[i+1][ 1 ])/6;
        dest[i][j] = 
			(src[i-1][j] + src[i][j] + src[i+1][j] + src[i-1][j-1] + src[i][j-1] + src[i+1][j-1])/6;
    }

    // middle:
    for (unsigned i = 1; i < dim - 1; ++i)
    {
        for (unsigned j = 1; j < dim - 1; ++j)
        {
            dest[i][j] = (src[i-1][j-1] + src[i-1][j] + src[i-1][j+1] +
                          src[ i ][j-1] + src[ i ][j] + src[ i ][j+1] +
                          src[i+1][j-1] + src[i+1][j] + src[i+1][j+1]) / 9 ;
        }
    }
}

void print(const array_type& array)
{
    for (unsigned i = 0; i < dim; ++i)
    {
        for (unsigned j = 0; j < dim; ++j)
            std::cout << array[i][j];
        std::cout << '\n';
    }
    std::cout << '\n';
}

int main()
{
    array_type a = 
    {
        1, 2, 3,
        4, 5, 6,
        7, 8, 9
    };

    array_type b = {};

    print(a);
    print(b);

    average(b, a);
    print(b);
}