当前位置: 面试刷题>> 僵尸矩阵 (经典算法题500道)


### 题目描述补充 **僵尸矩阵(Zombie Matrix)** 在一个无限大的二维网格上,每个格子可能为空(0)或者被僵尸占据(1)。给定一个初始的网格区域(一个二维数组),其中每个元素代表对应位置上的格子状态(0或1)。你的任务是编写一个算法,来模拟每轮僵尸感染的过程,并返回经过多轮感染后,整个网格的最终稳定状态。 感染规则如下: 1. 任何被僵尸占据的格子(值为1)始终保持为僵尸状态。 2. 一个空的格子(值为0)如果其上下左右四个相邻格子中至少有一个被僵尸占据,则该空格子将在下一轮被感染成僵尸状态(即变为1)。 **输入**: - 一个二维数组(网格),其中`grid[i][j]`表示网格上`(i, j)`位置的状态(0或1)。 **输出**: - 经过多轮感染后网格的最终稳定状态,也是一个二维数组。 **示例**: 输入: ``` grid = [ [0, 1, 0], [0, 1, 0], [0, 0, 0] ] ``` 输出: ``` [ [1, 1, 1], [1, 1, 1], [0, 1, 0] ] ``` ### PHP 示例代码 ```php function zombieInfection($grid) { $rows = count($grid); $cols = count($grid[0]); $changed = true; while ($changed) { $changed = false; $newGrid = []; for ($i = 0; $i < $rows; $i++) { $newGrid[$i] = []; for ($j = 0; $j < $cols; $j++) { $newGrid[$i][$j] = $grid[$i][$j]; // Check neighbors $infected = false; if ($i > 0 && $grid[$i-1][$j] == 1) $infected = true; if ($i < $rows-1 && $grid[$i+1][$j] == 1) $infected = true; if ($j > 0 && $grid[$i][$j-1] == 1) $infected = true; if ($j < $cols-1 && $grid[$i][$j+1] == 1) $infected = true; if ($grid[$i][$j] == 0 && $infected) { $newGrid[$i][$j] = 1; $changed = true; } } } $grid = $newGrid; } return $grid; } // 示例用法 $grid = [ [0, 1, 0], [0, 1, 0], [0, 0, 0] ]; $result = zombieInfection($grid); print_r($result); ``` ### Python 示例代码 ```python def zombie_infection(grid): rows, cols = len(grid), len(grid[0]) changed = True while changed: changed = False new_grid = [[cell for cell in row] for row in grid] for i in range(rows): for j in range(cols): if grid[i][j] == 0: infected = any(grid[ni][nj] == 1 for ni, nj in [(i-1, j), (i+1, j), (i, j-1), (i, j+1)] if 0 <= ni < rows and 0 <= nj < cols) if infected: new_grid[i][j] = 1 changed = True grid = new_grid return grid # 示例用法 grid = [ [0, 1, 0], [0, 1, 0], [0, 0, 0] ] result = zombie_infection(grid) print(result) ``` ### JavaScript 示例代码 ```javascript function zombieInfection(grid) { const rows = grid.length; const cols = grid[0].length; let changed = true; while (changed) { changed = false; const newGrid = JSON.parse(JSON.stringify(grid)); // 浅拷贝 for (let i = 0; i < rows; i++) { for (let j = 0; j < cols; j++) { if (grid[i][j] === 0) { const infected = [ [i-1, j], [i+1, j], [i, j-1], [i, j+1] ].some(([ni, nj]) => ni >= 0 && ni < rows && nj >= 0 && nj < cols && grid[ni][nj] === 1); if (infected) { newGrid[i][j] = 1; changed = true; } } } } grid = newGrid; } return grid; } // 示例用法 const grid = [ [0, 1, 0], [0, 1, 0], [0, 0, 0] ]; const result = zombieInfection(grid); console.log(result); ``` **码小课**网站中有更多相关内容分享给大家学习,包括但不限于算法解析、编程技巧、面试准备等,欢迎访问学习。
推荐面试题