其实只需要for循环中嵌套for循环,第一个for循环是遍历扫雷盘中的值,第二个for循环则是寻找该值周围的雷数。
#include "iostream"
using namespace std;
int main()
{
    int n,m,i,j,count,k,u;
    char a[1000][1000],b[1000][1000];
    cin >> n >> m;
    for(i=0;i<n;i++)                //输入扫雷盘
        for(j=0;j<m;j++)
            cin >> a[i][j];
    for(i=0;i<n;i++)                //对扫雷盘数组a进行判断,存入数组b中
        for(j=0;j<m;j++)
        {
            count = 0;            //标记周围的雷数
            if(a[i][j]=='*')        //如果当前位置是雷
                b[i][j] = '*';        //直接赋值为雷,不需要扫描周围雷数
            else                    //当前位置不为雷
            {
                for(k=i-1;k<=i+1;k++)        //从当前位的左边一位开始,到右边一位结束
                    for(u=j-1;u<=j+1;u++)    //从当前位的上边一位开始,到下边一位结束
                    {
                        if(k<0||u<0||k>=n||u>=m)        //如果数组下标非法直接跳过,进行下一次循环
                            continue;
                        if(a[k][u]=='*')            //如果为雷,标志位自增
                            count ++;
                    }
                b[i][j] = '0' + count;        //将雷数转换成char类型赋值给b数组
            }
        }
    for(i=0;i<n;i++)                //输出b数组
    {
        for(j=0;j<m;j++)
            cout << b[i][j];
        cout << endl;
    }
}