#include <iostream>
#include <vector>
#include <array>
using namespace std;
bool isValid(int x, int y, int n, int m);
int countMines(const vector<string>& matrix, int x, int y, int n, int m);
int main() {
int n, m;
cin >> n >> m;
vector<string> matrix(n);
for (int i = 0; i < n; ++i) {
cin >> matrix[i];
}
vector<vector<char>> minesweeper(n, vector<char>(m, ' '));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (matrix[i][j] == '*') {
minesweeper[i][j] = '*';
} else {
minesweeper[i][j] = '0' + countMines(matrix, i, j, n,
m); // 将数字转换为字符表示
}
}
}
// 输出扫雷矩阵
for (const auto& row : minesweeper) {
for (char c : row) {
cout << c;
}
cout << endl;
}
return 0;
}
// 检查坐标是否在矩阵范围内内
bool isValid(int x, int y, int n, int m) {
return x >= 0 && x < n && y >= 0 && y < m;
}
// 计算给定位置周围的雷数
int countMines(const vector<string>& matrix, int x, int y, int n, int m) {
int count = 0;
// 八个方向的偏移量
array<int, 8> dx = {-1, -1, -1, 0, 0, 1, 1, 1};
array<int, 8> dy = {-1, 0, 1, -1, 1, -1, 0, 1};
for (int i = 0; i < 8; ++i) {
int nx = x + dx[i];
int ny = y + dy[i];
if (isValid(nx, ny, n, m) && matrix[nx][ny] == '*') {
++count;
}
}
return count;
}