#include #include #include #include #include #define TASKNAME "square" typedef double real; const real eps = 1E-9; const int MaxN = 51, MaxDir = 4; const int dx [MaxDir] = { 1, 0, -1, 0}, dy [MaxDir] = { 0, 1, 0, -1}; real a [2] [MaxN] [MaxN]; int n; int main (void) { int x, y, dir; int cur; real mean, max, v; freopen (TASKNAME ".in", "rt", stdin); freopen (TASKNAME ".out", "wt", stdout); /* 1. Чтение входных данных */ scanf (" %d", &n); cur = 0; /* текущая копия квадрата */ dir = 0; /* направление */ x = y = 0; /* позиция */ mean = 0.0; /* среднее значение прочитанных величин */ do { scanf (" %lf", &v); a[cur][x][y] = a[!cur][x][y] = v; /* запишем в обе копии */ mean += v; x += dx[dir]; y += dy[dir]; if ((x == 0 || x == n) && (y == 0 || y == n)) /* угол */ dir++; } while (dir < MaxDir); mean /= n * 4; /* 2. Сначала заполним квадрат средним значением */ for (y = 1; y < n; y++) for (x = 1; x < n; x++) a[cur][x][y] = mean; /* 3. Теперь будем применять формулу, пока числа не перестанут меняться */ do { cur = !cur; /* поменяем местами старый и текущий квадраты */ for (y = 1; y < n; y++) for (x = 1; x < n; x++) { a[cur][x][y] = 0.0; /* сложим соседние значения из старого квадрата */ for (dir = 0; dir < MaxDir; dir++) a[cur][x][y] += a[!cur][x + dx[dir]][y + dy[dir]]; a[cur][x][y] *= 0.25; } /* теперь вычислим максимальную разность между текущим и старым квадратами */ max = 0.0; for (y = 1; y < n; y++) for (x = 1; x < n; x++) if (max < fabs (a[cur][x][y] - a[!cur][x][y])) max = fabs (a[cur][x][y] - a[!cur][x][y]); } while (max > eps); /* будем продолжать, пока разность достаточно велика */ /* 4. Вывод полученного квадрата */ for (y = 0; y <= n; y++) for (x = 0; x <= n; x++) printf ("%.5lf%c", a[cur][x][y], (x < n) ? ' ' : '\n'); return 0; }