#include <stdio.h>
#include <math.h>
int i2;
int x[10002], y[10002], mark[102][102], mark1[102][102], x11[10002], y11[10002];
double R[102][102], G[102][102], B[102][102], R1[102][102], G1[102][102], B1[102][102];
int judge(double x, double y, double z);
int c = 0;
int main()
{
char r, g, b;
int n, m;
scanf("%d %d", &n, &m);
int i, j, k, l, i1, j1;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf(" %c %lf %c %lf %c %lf", &r, &R[i][j], &g, &G[i][j], &b, &B[i][j]);
if ((R[i][j] == 0) && (G[i][j] == 0) && (B[i][j] == 0))
{
x[c] = i;
y[c] = j;
mark[i][j] = 1;
c++;
}
}
}
k = c;
if (k == n * m)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
printf("%c %0.lf %c %0.lf %c %0.lf ", r, R[i][j], g, G[i][j], b, B[i][j]);
}
printf("\n");
}
}
else
{
while (1)
{
int p = 0;
for (i = 0; i < c; i++)
{
double r1 = 0, g1 = 0, b1 = 0, c1 = 0;
if (mark[x[i]][y[i]] && (!mark[x[i] + 1][y[i]] || !mark[x[i] - 1][y[i]] || !mark[x[i]][y[i] + 1] || !mark[x[i]][y[i] - 1])) //确定第几轮 ,因为是按顺序更新像素,每一轮更新的像素要储存到新的数组中,否则会影响下一个像素的条件判断
{
if (x[i] == 0 && y[i] == 0)
{
double r1 = 0, g1 = 0, b1 = 0, c1 = 0;
if (judge(R[x[i] + 1][y[i]], G[x[i] + 1][y[i]], B[x[i] + 1][y[i]]))
{
r1 += R[x[i] + 1][y[i]];
g1 += G[x[i] + 1][y[i]];
b1 += B[x[i] + 1][y[i]];
c1++;
}
if (judge(R[x[i]][y[i] + 1], G[x[i]][y[i] + 1], B[x[i]][y[i] + 1]))
{
r1 += R[x[i]][y[i] + 1];
g1 += G[x[i]][y[i] + 1];
b1 += B[x[i]][y[i] + 1];
c1++;
}
if (c1 != 0) //除数不能为零,以下同理
{
R1[x[i]][y[i]] = ceil(r1 / c1);
G1[x[i]][y[i]] = ceil(g1 / c1);
B1[x[i]][y[i]] = ceil(b1 / c1);
}
}
else if (x[i] == n - 1 && y[i] == 0)
{
double r1 = 0, g1 = 0, b1 = 0, c1 = 0;
if (judge(R[x[i] - 1][y[i]], G[x[i] - 1][y[i]], B[x[i] - 1][y[i]]))
{
r1 += R[x[i] - 1][y[i]];
g1 += G[x[i] - 1][y[i]];
b1 += B[x[i] - 1][y[i]];
c1++;
}
if (judge(R[x[i]][y[i] + 1], G[x[i]][y[i] + 1], B[x[i]][y[i] + 1]))
{
r1 += R[x[i]][y[i] + 1];
g1 += G[x[i]][y[i] + 1];
b1 += B[x[i]][y[i] + 1];
c1++;
}
if (c1 != 0)
{
R1[x[i]][y[i]] = ceil(r1 / c1);
G1[x[i]][y[i]] = ceil(g1 / c1);
B1[x[i]][y[i]] = ceil(b1 / c1);
}
}
else if (x[i] == 0 && y[i] == m - 1)
{
double r1 = 0, g1 = 0, b1 = 0, c1 = 0;
if (judge(R[x[i] + 1][y[i]], G[x[i] + 1][y[i]], B[x[i] + 1][y[i]]))
{
r1 += R[x[i] + 1][y[i]];
g1 += G[x[i] + 1][y[i]];
b1 += B[x[i] + 1][y[i]];
c1++;
}
if (judge(R[x[i]][y[i] - 1], G[x[i]][y[i] - 1], B[x[i]][y[i] - 1]))
{
r1 += R[x[i]][y[i] - 1];
g1 += G[x[i]][y[i] - 1];
b1 += B[x[i]][y[i] - 1];
c1++;
}
if (c1 != 0)
{
R1[x[i]][y[i]] = ceil(r1 / c1);
G1[x[i]][y[i]] = ceil(g1 / c1);
B1[x[i]][y[i]] = ceil(b1 / c1);
}
}
else if (x[i] == n - 1 && y[i] == m - 1)
{
double r1 = 0, g1 = 0, b1 = 0, c1 = 0;
if (judge(R[x[i] - 1][y[i]], G[x[i] - 1][y[i]], B[x[i] - 1][y[i]]))
{
r1 += R[x[i] - 1][y[i]];
g1 += G[x[i] - 1][y[i]];
b1 += B[x[i] - 1][y[i]];
c1++;
}
if (judge(R[x[i]][y[i] - 1], G[x[i]][y[i] - 1], B[x[i]][y[i] - 1]))
{
r1 += R[x[i]][y[i] - 1];
g1 += G[x[i]][y[i] - 1];
b1 += B[x[i]][y[i] - 1];
c1++;
}
if (c1 != 0)
{
R1[x[i]][y[i]] = ceil(r1 / c1);
G1[x[i]][y[i]] = ceil(g1 / c1);
B1[x[i]][y[i]] = ceil(b1 / c1);
}
}
else if (x[i] == 0 && y[i] != 0 && y[i] != m - 1)
{
double r1 = 0, g1 = 0, b1 = 0, c1 = 0;
if (judge(R[x[i] + 1][y[i]], G[x[i] + 1][y[i]], B[x[i] + 1][y[i]]))
{
r1 += R[x[i] + 1][y[i]];
g1 += G[x[i] + 1][y[i]];
b1 += B[x[i] + 1][y[i]];
c1++;
}
if (judge(R[x[i]][y[i] + 1], G[x[i]][y[i] + 1], B[x[i]][y[i] + 1]))
{
r1 += R[x[i]][y[i] + 1];
g1 += G[x[i]][y[i] + 1];
b1 += B[x[i]][y[i] + 1];
c1++;
}
if (judge(R[x[i]][y[i] - 1], G[x[i]][y[i] - 1], B[x[i]][y[i] - 1]))
{
r1 += R[x[i]][y[i] - 1];
g1 += G[x[i]][y[i] - 1];
b1 += B[x[i]][y[i] - 1];
c1++;
}
if (c1 != 0)
{
R1[x[i]][y[i]] = ceil(r1 / c1);
G1[x[i]][y[i]] = ceil(g1 / c1);
B1[x[i]][y[i]] = ceil(b1 / c1);
}
}
else if (x[i] == n - 1 && y[i] != 0 && y[i] != m - 1)
{
double r1 = 0, g1 = 0, b1 = 0, c1 = 0;
if (judge(R[x[i] - 1][y[i]], G[x[i] - 1][y[i]], B[x[i] - 1][y[i]]))
{
r1 += R[x[i] - 1][y[i]];
g1 += G[x[i] - 1][y[i]];
b1 += B[x[i] - 1][y[i]];
c1++;
}
if (judge(R[x[i]][y[i] + 1], G[x[i]][y[i] + 1], B[x[i]][y[i] + 1]))
{
r1 += R[x[i]][y[i] + 1];
g1 += G[x[i]][y[i] + 1];
b1 += B[x[i]][y[i] + 1];
c1++;
}
if (judge(R[x[i]][y[i] - 1], G[x[i]][y[i] - 1], B[x[i]][y[i] - 1]))
{
r1 += R[x[i]][y[i] - 1];
g1 += G[x[i]][y[i] - 1];
b1 += B[x[i]][y[i] - 1];
c1++;
}
if (c1 != 0)
{
R1[x[i]][y[i]] = ceil(r1 / c1);
G1[x[i]][y[i]] = ceil(g1 / c1);
B1[x[i]][y[i]] = ceil(b1 / c1);
}
}
else if (y[i] == 0 && x[i] != 0 && x[i] != n - 1)
{
double r1 = 0, g1 = 0, b1 = 0, c1 = 0;
if (judge(R[x[i] - 1][y[i]], G[x[i] - 1][y[i]], B[x[i] - 1][y[i]]))
{
r1 += R[x[i] - 1][y[i]];
g1 += G[x[i] - 1][y[i]];
b1 += B[x[i] - 1][y[i]];
c1++;
}
if (judge(R[x[i]][y[i] + 1], G[x[i]][y[i] + 1], B[x[i]][y[i] + 1]))
{
r1 += R[x[i]][y[i] + 1];
g1 += G[x[i]][y[i] + 1];
b1 += B[x[i]][y[i] + 1];
c1++;
}
if (judge(R[x[i] + 1][y[i]], G[x[i] + 1][y[i]], B[x[i] + 1][y[i]]))
{
r1 += R[x[i] + 1][y[i]];
g1 += G[x[i] + 1][y[i]];
b1 += B[x[i] + 1][y[i]];
c1++;
}
if (c1 != 0)
{
R1[x[i]][y[i]] = ceil(r1 / c1);
G1[x[i]][y[i]] = ceil(g1 / c1);
B1[x[i]][y[i]] = ceil(b1 / c1);
}
}
else if (y[i] == m - 1 && x[i] != 0 && x[i] != n - 1)
{
double r1 = 0, g1 = 0, b1 = 0, c1 = 0;
if (judge(R[x[i] - 1][y[i]], G[x[i] - 1][y[i]], B[x[i] - 1][y[i]]))
{
r1 += R[x[i] - 1][y[i]];
g1 += G[x[i] - 1][y[i]];
b1 += B[x[i] - 1][y[i]];
c1++;
}
if (judge(R[x[i]][y[i] - 1], G[x[i]][y[i] - 1], B[x[i]][y[i] - 1]))
{
r1 += R[x[i]][y[i] - 1];
g1 += G[x[i]][y[i] - 1];
b1 += B[x[i]][y[i] - 1];
c1++;
}
if (judge(R[x[i] + 1][y[i]], G[x[i] + 1][y[i]], B[x[i] + 1][y[i]]))
{
r1 += R[x[i] + 1][y[i]];
g1 += G[x[i] + 1][y[i]];
b1 += B[x[i] + 1][y[i]];
c1++;
}
if (c1 != 0)
{
R1[x[i]][y[i]] = ceil(r1 / c1);
G1[x[i]][y[i]] = ceil(g1 / c1);
B1[x[i]][y[i]] = ceil(b1 / c1);
}
}
else
{
double r1 = 0, g1 = 0, b1 = 0, c2 = 0;
if (judge(R[x[i] - 1][y[i]], G[x[i] - 1][y[i]], B[x[i] - 1][y[i]]))
{
r1 += R[x[i] - 1][y[i]];
g1 += G[x[i] - 1][y[i]];
b1 += B[x[i] - 1][y[i]];
c2++;
}
if (judge(R[x[i]][y[i] - 1], G[x[i]][y[i] - 1], B[x[i]][y[i] - 1]))
{
r1 += R[x[i]][y[i] - 1];
g1 += G[x[i]][y[i] - 1];
b1 += B[x[i]][y[i] - 1];
c2++;
}
if (judge(R[x[i] + 1][y[i]], G[x[i] + 1][y[i]], B[x[i] + 1][y[i]]))
{
r1 += R[x[i] + 1][y[i]];
g1 += G[x[i] + 1][y[i]];
b1 += B[x[i] + 1][y[i]];
c2++;
}
if (judge(R[x[i]][y[i] + 1], G[x[i]][y[i] + 1], B[x[i]][y[i] + 1]))
{
r1 += R[x[i]][y[i] + 1];
g1 += G[x[i]][y[i] + 1];
b1 += B[x[i]][y[i] + 1];
c2++;
}
if (c2 != 0)
{
R1[x[i]][y[i]] = ceil(r1 / c2);
G1[x[i]][y[i]] = ceil(g1 / c2);
B1[x[i]][y[i]] = ceil(b1 / c2);
}
}
if (R1[x[i]][y[i]] || G1[x[i]][y[i]] || B1[x[i]][y[i]])
{
mark1[x[i]][y[i]] = 0;
k--;
x11[p] = x[i];
y11[p] = y[i];
p++;
}
}
}
for (i2 = 0; i2 < p; i2++) //一轮更新完毕后,将本轮更新的数赋值到原数组(注意,数值和判断数组mark都要用新数组储存)
{
mark[x11[i2]][y11[i2]] = mark1[x11[i2]][y11[i2]];
R[x11[i2]][y11[i2]] = R1[x11[i2]][y11[i2]];
B[x11[i2]][y11[i2]] = B1[x11[i2]][y11[i2]];
G[x11[i2]][y11[i2]] = G1[x11[i2]][y11[i2]];
}
if (k == 0)
break;
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
printf("%c %0.lf %c %0.lf %c %0.lf ", r, R[i][j], g, G[i][j], b, B[i][j]);
}
printf("\n");
}
}
return 0;
}
int judge(double x, double y, double z)
{
if (x || y || z)
return 1;
else
return 0;
}