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";
}
}

[…] 扫雷 题解 […]