如何用C语言实现10x10地图炸弹爆炸半径计算与安全点统计
实现思路
- 先收集地图中所有炸弹的坐标,避免遍历全图重复判断
- 对每颗炸弹,计算其8方向所有有效范围内格子的伤害值(采用切比雪夫距离计算半径,每向外1格伤害衰减1,伤害大于0则累加到对应格子)
- 最后遍历全图统计数值为0的安全点总数,按要求输出结果
修改后的完整代码
#include <stdio.h> #include <stdlib.h> // 用于调用abs函数计算绝对值 int main() { int map[10][10], p, i, j, safe; char charmap[10][10]; int bombs[100][2], bomb_cnt = 0; // 存储所有炸弹的坐标,最多支持100个炸弹 scanf("%d", &p); // 初始化伤害地图全为0 for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) map[i][j] = 0; // 读取字符地图,同步收集所有炸弹坐标 for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) { scanf(" %c", &charmap[i][j]); if (charmap[i][j] == 'X') { bombs[bomb_cnt][0] = i; bombs[bomb_cnt][1] = j; bomb_cnt++; } } // 遍历所有炸弹计算爆炸伤害 for (int b = 0; b < bomb_cnt; b++) { int x = bombs[b][0]; int y = bombs[b][1]; // 遍历炸弹威力覆盖的所有坐标偏移量 for (int dx = -(p-1); dx <= p-1; dx++) { for (int dy = -(p-1); dy <= p-1; dy++) { int nx = x + dx; int ny = y + dy; // 跳过超出地图边界的坐标 if (nx < 0 || nx >= 10 || ny < 0 || ny >= 10) continue; // 计算切比雪夫距离(8方向扩散的距离判定规则) int dist = abs(dx) > abs(dy) ? abs(dx) : abs(dy); int damage = p - dist; if (damage > 0) map[nx][ny] += damage; } } } // 统计安全点总数 safe = 0; for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) if (map[i][j] == 0) safe++; // 输出伤害地图 for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("%d ", map[i][j]); } printf("\n"); } // 输出安全点数量 printf("\n%d\n", safe); return 0; }
核心修改说明
- 新增炸弹坐标存储数组,读取地图时同步记录所有炸弹位置,避免后续重复遍历识别
- 新增爆炸伤害计算逻辑:对每个炸弹遍历所有可能的覆盖范围,自动处理边界判定、伤害衰减、多炸弹伤害叠加的场景
- 新增安全点统计逻辑,遍历全图计数数值为0的格子
- 调整输出逻辑,完全匹配题目要求的地图+空行+安全点数量的输出格式
内容的提问来源于stack exchange,提问作者sggus
相关产品推荐
相关产品推荐

