Problem C: 扫雷

Problem C: 扫雷

[Creator : ]
Time Limit : 1.000 sec  Memory Limit : 128 MiB

Description

有一个扫雷游戏的出题模块。这个模块的输入是一张地图,标记了每个地雷的位置,地雷以 * 表示,空地以 . 表示。这个模块的输出是一个表格,统计了每个空地周围八个方格内的地雷数量。

例如,给定一个初始地图:

*.*
...
*..
则应输出:
*2*
231
*10

请你帮助小爱来完成这个程序。

#include <iostream>
using namespace std;
 
int main() {
    int n, m;
    cin >> n >> m;  // 读取地图的行数和列数
     
    // 定义地图数组,大小为100x100,符合题目要求
    char mine[100][100];
     
    // 读取地图
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> mine[i][j];
        }
    }
     
    // 定义结果数组,用于存储输出
    char result[100][100];
     
    // 遍历每个方格
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            // 如果当前位置是地雷
            if (mine[i][j] == '*') {
                result[i][j] = '*';  // 直接输出*
            } else {
                // 统计周围8个方向的地雷数量
                int count = 0;
                 
                // 检查周围8个方向
                // 行偏移:-1, 0, 1
                for (int di = -1; di <= 1; di++) {
                    // 列偏移:-1, 0, 1
                    for (int dj = -1; dj <= 1; dj++) {
                        // 跳过当前位置(di=0且dj=0的情况)
                        if (di == 0 && dj == 0) continue;
                         
                        // 计算要检查的位置的行和列
                        int ni = i + di;
                        int nj = j + dj;
                         
                        // 检查是否在边界内
                        if (ni >= 0 && ni < n && nj >= 0 && nj < m) {
                            // 如果该位置是地雷
                            if (mine[ni][nj] == '*') {
                                count++;  // 地雷计数加1
                            }
                        }
                    }
                }
                 
                // 将计数转换为字符存储
                // count是0-8的数字,加上'0'的ASCII码转换为对应的字符
                result[i][j] = '0' + count;
            }
        }
    }
     
    // 输出结果
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << result[i][j];
        }
        cout << endl;  // 每行结束后换行
    }
     
    return 0;
}

Input

  • 第一行:两个整数 lns="http://www.w3.org/1998/Math/MathML">n 和 lns="http://www.w3.org/1998/Math/MathML">m
  • 接下来有 lns="http://www.w3.org/1998/Math/MathML">n×m 个字符,表示每个方格是否存在地雷。
1≤n,m≤100

Output

  • 共计 lns="http://www.w3.org/1998/Math/MathML">n×m 个字符,表示每个方格周围地雷统计信息,若原本这个位置就有地雷,输出 *

Sample Input Copy

3 4
*..*
.**.
.*.*

Sample Output Copy

*33*
3**3
2*4*