题目链接:https://www.lanqiao.cn/problems/549/learning/
个人评价:难度 1 星(满星:5)
前置知识:无
整体思路
- 按题意模拟;
- 为了减少不必要的“数组越界”判断,让数组下标从
1
1
1 开始,这样即使判断第一行的上一行是否有雷,也不用加一个
if(i - 1 >= 0)
的判断了; - 使用一个数组记录
8
8
8 个方向,无需
8
8
8 个
if
判断 8 8 8 个方向的雷,只需要一个for
循环加if
即可。
过题代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100 + 100;
int n, m;
int ans[maxn][maxn];
// 方向数组
const int dir[8][2] = {
{-1, -1}, {-1, 0}, {-1, 1},
{0, -1}, {0, 1},
{1, -1}, {1, 0}, {1, 1}
};
int main() {
#ifdef ExRoc
freopen("test.txt","r",stdin);
#endif // ExRoc
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> ans[i][j];
// 直接改为用 9 标记为雷,后面直接判断 9 的个数即可
if (ans[i][j] == 1) {
ans[i][j] = 9;
}
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
// 已经是雷,不用判断周围 8 个位置的雷数
if (ans[i][j] == 9) {
continue;
}
// 遍历方向数组,有雷就 + 1
for (int k = 0; k < 8; ++k) {
ans[i][j] += (ans[i + dir[k][0]][j + dir[k][1]] == 9);
}
}
}
// 输出答案
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cout << ans[i][j] << " ";
}
cout << endl;
}
return 0;
}