1 条题解

  • 0
    @ 2026-11-14 21:00:43

    四级的题目真是轻而易举呢——

    这道题目是一个考验我们逆向思维的题目。通常情况下,我们能想到的解决思路是

    遍历每个格子,判断毗邻的炸弹个数。

    然而这么做可能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

    信息

    ID
    1268
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者