#include <iostream>
using namespace std;
#include<vector>
int main() {
    int n,m;
    cin >> n >> m;
    vector<vector<char>> sweeping(n+2,vector<char>(m+2));
    //输入初始雷布局
    for(int i =1;i<n+1;++i){
      for(int j =1;j<m+1;++j){
        cin >> sweeping[i][j];
    }
    }
    //存放数字的
    int count = 0;
     for(int i =1;i<n+1;++i){
      for(int j =1;j<m+1;++j){
        if(sweeping[i][j] =='.'){
        
        //判断是不是边界的 第一行/列 最后一行/列
        //如果增加一行列就可以不判断边界
          count=0;
         for(int a =i-1;a<=i+1;++a){
            for(int b=j-1;b<=j+1;++b){
                 if(sweeping[a][b] =='*'){
                      count++;
                 }
            }
         }
        //"."替换成数字
        sweeping[i][j] =count+'0';
        }
    }
    }
    //打印最终结果
       for(int i =1;i<n+1;++i){
      for(int j =1;j<m+1;++j){
        cout << sweeping[i][j];
      }
      cout <<endl;
       }
}

提供一个新的思路 比较简单 思路在注释