1174 字
4 分钟阅读
扫雷

题目描述

给定一个 row 行 col 列的地图,有地雷和空地。其中 _ 代表空地,* 代表地雷。

对于每个空地,求出所有曼哈顿距离小于等于 k 的范围内地雷数量,超出地图部分我们认为没有地雷。若当前位置为地雷,则输出 -1

对于两个点 (x_1,y_1),(x_2,y_2) ,其曼哈顿距离 dis = | x_1 - x_2| + | y_1 - y_2 |

输入格式

第一行输入三个正整数 row,col,k   (2\le row,col,k \le 10) ,分别代表地图的行数列数和要求的曼哈顿距离的最大值。
接下来的 row 行,每行 col 个字符,代表地图。

输出格式

输出 row 行,每行 col 个数字,代表题目所求的答案。

输入样例 1

2 2 1
_*
*_

输出样例 1

2 -1 
-1 2

输入样例 2

4 6 3
**_*__
*_____
*_*___
__*_*_

输出样例 2

-1 -1 6 -1 3 1 
-1 7 7 6 3 2 
-1 6 -1 5 4 2 
5 6 -1 4 -1 2

题意

统计每个空地附近曼哈顿距离小于 k 的地雷数量。

思路

注意到数据范围非常小,直接四个for循环枚举位置1和位置2,位置1的意义是统计当前位置的答案,也就是曼哈顿距离小于等于 k 的地雷有多少个,位置2的意义是穷举所有位置,看能不能符合题目约束。

执行步骤:

如果位置1是地雷,直接将位置1的计数器设置为 -1 。否则检查位置2是不是地雷,如果是,计算位置2到位置1的曼哈顿距离,小于 k ,将位置1的计数器加一。

最终输出所有位置的计数器即可。

代码

void solve(){
    int n,m,k;
    cin >> n >> m >> k;
    char graph[n + 1][m + 1];
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            cin >> graph[i][j];
        }
    }
    int ans[n + 1][m + 1] = {0};
    for(int i = 1;i <= n;i++){ // 枚举位置1的横坐标
        for(int j = 1;j <= m;j++){ // 枚举位置1的纵坐标
            if(graph[i][j] == '*'){
                ans[i][j] = -1;
                continue;
            }
            for(int x = 1;x <= n;x++){ // 枚举位置2的横坐标
                for(int y = 1;y <= m;y++){ // 枚举位置2的纵坐标
                    int dis = abs(i - x) + abs(j - y);
                    if(graph[x][y] == '*' && dis <= k){
                        ans[i][j]++;
                    }
                }
            }
        }
    }
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            cout << ans[i][j] << " ";
        }
        cout << "\n";
    }
}

1 条评论

  1. 2026年贵工程寒假训练题解 – 追求的个人博客 2026年1月10日

    […] 扫雷 题解 […]

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注