#include<iostream>
#include<vector>//使用原因vector二维数组传递好实现且安全,同时初始化方便
using namespace std;
int See(int i,int j,const vector<vector<char>> &a)//该函数扫描周围八格有无雷,这里是const引用传递
{   int count=0;//建立一个计数器
    for(int k=i-1;k<=i+1;k++)
    {
        for(int l=j-1;l<=j+1;l++)//无需跳过本格,主函数中有判定,一定是无雷所以不影响
        {
            if(a[k][l]=='*')count++;
        }
    }
    return count;
}
int main()
{
    int n,m;cin>>n>>m;
    vector<vector<char>> a(n+2,vector<char>(m+2,'.'));//+2是为了让实际储存大一圈避免再写溢出判定
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]=='*')cout<<'*';
            else cout<<See(i,j,a);//这里if简单判定是否是雷
        }
        cout<<endl;
    }
    return 0;
}

为了实现模块化(本人喜欢模块化),必须考虑二维数组传递问题,所以想到了vector

vector有三种二维数组传递方式,分别是值传递,引用传递,和const引用传递(只读)

这里用的const引用传递不会创建副本,也避免数组被改变(提高安全性)