当前位置: 面试刷题>> 僵尸矩阵 (经典算法题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);
```
**码小课**网站中有更多相关内容分享给大家学习,包括但不限于算法解析、编程技巧、面试准备等,欢迎访问学习。