#include <iostream>
using namespace std;
char a[20004][20004]={0};//在主函数外定义数组,节省内存,注意使用char类型存储字符
int main() {
int n{},m{};//n行m列
cin>>n>>m;
n+=10;
m+=10;//将n和m都往后移十位,目的是防止数组访问越界(也可以移动其他位数)
for(int i=10;i<n;i++)//往后移了十位所以循环初始值也+10
{
for(int j=10;j<m;j++)//到这里输入了n行m列
{
cin>>a[i][j];
// cout<<a[i][j];
}
}
int cnt{};//计数器,记录地雷个数
int line{};//判断何时换行
for(int i=10;i<n;i++)
{
for(int j=10;j<m;j++)//对这个n行m列的矩阵进行检索
{
if(a[i][j]=='*')//本位置为地雷则输出*
{
cout<<"*";
}
else//判断其他位置有多少地雷
{
if(a[i-1][j-1]=='*')//左上方
cnt++;
if(a[i-1][j]=='*')//正上方
cnt++;
if(a[i-1][j+1]=='*')//右上方
cnt++;
if(a[i][j-1]=='*')//左边
cnt++;
if(a[i][j+1]=='*')//右边
cnt++;
if(a[i+1][j-1]=='*')//左下方
cnt++;
if(a[i+1][j]=='*')//正下方
cnt++;
if(a[i+1][j+1]=='*')//右下方
cnt++;
cout<<cnt;//输出地雷个数
cnt=0;//重置计数器
}
line++;//换行计数器加加
if(line==m-10)//如果换行计数等于原来的列数,就换行
{
line=0;
cout<<endl;
}
}
}
return 0;
}
// 64 位输出请用 printf("%lld")