#include<stdio.h>
#include<stdlib.h>
class Bomb
{
public:
Bomb(int n, int m) : m_line(n), m_column(m)
{
m_arr = new int* [n];
m_isVisited = new int* [n];
for (int i = 0; i < n; i++)
{
m_arr[i] = new int[m];
m_isVisited[i] = new int[m];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
m_isVisited[i][j] = 0;//has not been visited yet
m_arr[i][j] = 0;
}
}
};
~Bomb() {
//delete array
};
int Traversal(int x, int y);
void Initialize();
int IsBomb(int x, int y);
int** m_arr;
int** m_isVisited;
private:
int m_line;
int m_column;
};
int Bomb::Traversal(int x, int y)
{
//out of range
if (x < 0 || y < 0 || y >= m_column || x >= m_line)
{
return 0;
}
//(x,y) has been visited before
if (1 == m_isVisited[x][y])
return 1;
if (0 == m_arr[x][y])
{
m_isVisited[x][y] = 1; //set it been visited
Traversal(x - 1, y-1);
Traversal(x - 1, y);
Traversal(x - 1, y+1);
Traversal(x, y - 1);
Traversal(x, y + 1);
Traversal(x + 1, y - 1);
Traversal(x + 1, y);
Traversal(x + 1, y + 1);
}
else {
//a bomb(999) or number boundary
if (999 == m_arr[x][y])
return 0;
m_isVisited[x][y] = 1; //visit number boudary
// printf("%d", m_arr[x][y]);
return 0;
}
return 0;
}
int Bomb::IsBomb(int x, int y)
{
//out of range
if (x < 0 || y < 0 || y >= m_column || x >= m_line)
{
return 0;
}
if (999 == m_arr[x][y])
return 1;
return 0;
}
void Bomb::Initialize()
{
for (int i = 0; i < m_line; i++)
{
for (int j = 0; j < m_column; j++)
{
int sum = 0;
if (999 == m_arr[i][j])
continue;
sum = IsBomb(i - 1, j - 1) + IsBomb(i - 1, j) + IsBomb(i - 1, j + 1) + IsBomb(i, j - 1) + IsBomb(i, j + 1) + IsBomb(i + 1, j - 1) + IsBomb(i + 1, j) + IsBomb(i + 1, j + 1);
m_arr[i][j] = sum;
}
}
}
int main(void)
{
int n = 0;
int m = 0;
scanf_s("%d%d", &n, &m);
Bomb obj(n,m);
int x = 0;
int y = 0;
scanf_s("%d%d", &x, &y);
for (int i = 0;i < n;i++)
{
char tmp = getchar();//eat '\n'
for (int j = 0;j < m;j++)
{
char in = getchar();
if ('*' == in)
obj.m_arr[i][j] = 999;
}
}
obj.Initialize();
#if 0
for (int i = 0;i < n;i++)
{
for (int j = 0;j < m;j++)
{
printf("%d", obj.m_arr[i][j]);
}
printf("\n");
}
#endif
if (obj.IsBomb(x-1, y-1))
{
printf("GG");
return 0;
}
obj.Traversal(x-1, y-1);
#if 0
for (int i = 0;i < n;i++)
{
for (int j = 0;j < m;j++)
{
printf("%d", obj.m_isVisited[i][j]);
}
printf("\n");
}
#endif
for (int i = 0;i < n;i++)
{
for (int j = 0;j < m;j++)
{
if (obj.m_isVisited[i][j] == 1)
{
printf("%d", obj.m_arr[i][j]);
continue;
}
else
{
if (obj.m_arr[i][j] == 999)
printf("*");
else printf(".");
}
}
printf("\n");
}
return 0;
}