1 条题解
-
0
四级的题目真是轻而易举呢——这道题目是一个考验我们逆向思维的题目。通常情况下,我们能想到的解决思路是
遍历每个格子,判断毗邻的炸弹个数。
然而这么做可能
TLE。如果逆向思维去看的话我有一个更好的思路:遍历每个炸弹,给炸弹相邻的格子打上计数标记。
这是代码:
#include <iostream> #include <vector> using namespace std; const int dir[2][8] = { {1 ,1 ,1 ,0 ,0 ,-1,-1,-1}, {1 ,0 ,-1,1 ,-1,1 ,0 ,-1} }; int main() { //输入部分 int n,m,q; cin >> n >> m >> q; vector<vector<int>> Booms(n + 2,vector<int>(m + 2,0)); vector<int> xs(q); vector<int> ys(q); for (int i = 0;i < q;i ++) { int x,y; cin >> x >> y; Booms[x][y] = -1; xs[i] = x; ys[i] = y; } //绘制部分 for (int i = 0;i < q;i ++) { //遍历每个炸弹 for (int j = 0;j < 8;j ++) { //遍历每个相邻格 int dx = xs[i] + dir[0][j], dy = ys[i] + dir[1][j]; //检查边界情况 if (dx > n || dx < 1 || dy > m || dy < 1) { continue; } //不统计炸弹格 if (Booms[dx][dy] <= -1) { continue; } //累加炸弹数 Booms[dx][dy] ++; } } //输出部分 for (int i = 1;i <= n;i ++) { //遍历每个格子 for (int j = 1;j <= m;j ++) { if (Booms[i][j] <= -1) { cout << "* "; } else { cout << Booms[i][j] << ' '; } } cout << '\n'; } }大家不要学这种人!!!千万不要忘记写
return 0
- 1
信息
- ID
- 1268
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者