Problem C: 扫雷
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
- 第一行:两个整数 和 ;
- 接下来有 个字符,表示每个方格是否存在地雷。
Output
-
共计 个字符,表示每个方格周围地雷统计信息,若原本这个位置就有地雷,输出
*。
Sample Input Copy
3 4
*..*
.**.
.*.*
Sample Output Copy
*33*
3**3
2*4*