#include<iostream>//iostream
#include<vector>//vector
using namespace std;
//上面的,iostream;vector
int main() {
int n, m;
cin >> n >> m; // 读取雷区行数和列数
vector<vector<char>> grid(n, vector<char>(m));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> grid[i][j]; // 读取雷区分布情况
}
}
// 遍历雷区,计算并输出非地雷格周围的地雷数量
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (grid[i][j] == '?') {
int count = 0;
// 遍历当前格子的8个相邻方向
for (int di = -1; di <= 1; ++di) {
for (int dj = -1; dj <= 1; ++dj) {
int ni = i + di, nj = j + dj;
// 检查相邻格子是否在雷区内且为地雷格
if (ni >= 0 && ni < n && nj >= 0 && nj < m && grid[ni][nj] == '*') {
count++;
}
}
}
cout << count; // 输出非地雷格周围的地雷数量
} else {
cout << grid[i][j]; // 输出地雷格标记
}
}
cout << endl; // 换行
}
return 0;
}