当前位置: 面试刷题>> 炸弹袭击 (经典算法题500道)


### 题目描述补充 **题目:炸弹袭击(Grid Bombing)** 在一个N×M的网格中,每个格子可以放置一个炸弹或者为空。当炸弹爆炸时,它会以其所在位置为中心,向上、下、左、右四个方向扩散,直到遇到网格边界或另一个炸弹为止。现在,给定一个网格的初始状态(包含炸弹和空位置),计算所有炸弹爆炸后,网格中剩余多少空格位置。 **输入**: - 一个二维数组`grid`,其中`grid[i][j]`为`'B'`表示该位置有炸弹,为`'.'`表示该位置为空。 - 网格的行数`N`和列数`M`。 **输出**: - 爆炸后剩余的空格位置数量。 ### 示例 **输入**: ``` grid = [ ['B', '.', '.', 'B', '.'], ['.', '.', 'B', '.', '.'], ['.', '.', '.', '.', '.'], ['B', '.', '.', '.', 'B'], ['.', '.', 'B', '.', '.'] ] N = 5, M = 5 ``` **输出**: ``` 7 ``` **解释**: 网格中有四个炸弹,爆炸后,只有7个空格位置未被破坏。 ### PHP 示例代码 ```php function countRemainingSpaces($grid) { $N = count($grid); $M = count($grid[0]); $visited = array_fill(0, $N, array_fill(0, $M, false)); $count = 0; for ($i = 0; $i < $N; $i++) { for ($j = 0; $j < $M; $j++) { if ($grid[$i][$j] == 'B' && !$visited[$i][$j]) { dfs($grid, $visited, $i, $j); } elseif ($grid[$i][$j] == '.') { $count++; } } } return $count; } function dfs(&$grid, &$visited, $i, $j) { $N = count($grid); $M = count($grid[0]); $directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]; $visited[$i][$j] = true; foreach ($directions as $dir) { $ni = $i + $dir[0]; $nj = $j + $dir[1]; if ($ni >= 0 && $ni < $N && $nj >= 0 && $nj < $M && !$visited[$ni][$nj] && $grid[$ni][$nj] == '.') { $visited[$ni][$nj] = true; dfs($grid, $visited, $ni, $nj); } } } // 示例用法 $grid = [ ['B', '.', '.', 'B', '.'], ['.', '.', 'B', '.', '.'], ['.', '.', '.', '.', '.'], ['B', '.', '.', '.', 'B'], ['.', '.', 'B', '.', '.'] ]; echo countRemainingSpaces($grid); // 输出 7 ``` ### Python 示例代码 ```python def count_remaining_spaces(grid): N, M = len(grid), len(grid[0]) visited = [[False] * M for _ in range(N)] count = 0 def dfs(i, j): if i < 0 or i >= N or j < 0 or j >= M or visited[i][j] or grid[i][j] != '.': return visited[i][j] = True for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]: dfs(i + dx, j + dy) for i in range(N): for j in range(M): if grid[i][j] == 'B' and not visited[i][j]: dfs(i, j) elif grid[i][j] == '.': count += 1 return count # 示例用法 grid = [ ['B', '.', '.', 'B', '.'], ['.', '.', 'B', '.', '.'], ['.', '.', '.', '.', '.'], ['B', '.', '.', '.', 'B'], ['.', '.', 'B', '.', '.'] ] print(count_remaining_spaces(grid)) # 输出 7 ``` ### JavaScript 示例代码 ```javascript function countRemainingSpaces(grid) { const N = grid.length; const M = grid[0].length; const visited = Array.from({ length: N }, () => Array(M).fill(false)); let count = 0; function dfs(i, j) { if (i < 0 || i >= N || j < 0 || j >= M || visited[i][j] || grid[i][j] !== '.') { return; } visited[i][j] = true; const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]; for (const [dx, dy] of directions) { dfs(i + dx, j + dy); } } for (let i = 0; i < N; i++) { for (let j = 0; j < M; j++) { if (grid[i][j] === 'B' && !visited[i][j]) { dfs(i, j); } else if (grid[i][j] === '.') { count++; } } } return count; } // 示例用法 const grid = [ ['B', '.', '.', 'B', '.'], ['.', '.', 'B', '.', '.'], ['.', '.', '.', '.', '.'], ['B', '.', '.', '.', 'B'], ['.', '.', 'B', '.', '.'] ]; console.log(countRemainingSpaces(grid)); // 输出 7 ``` **码小课网站中有更多相关内容分享给大家学习**,包括但不限于算法题解、数据结构、编程技巧等,欢迎访问码小课网站深入学习。
推荐面试题