#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 ' ' 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(" "); } #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(" "); } #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(" "); } return 0; }