蓝桥杯真题 - 扫雷 - 题解
题目链接: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 ExRocfreopen("test.txt","r",stdin);
#endif // ExRoccin >> 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;}// 遍历方向数组,有雷就 + 1for (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;
}