当前位置: 面试刷题>> 僵尸矩阵 (经典算法题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 示例代码

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 示例代码

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 示例代码

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);

码小课网站中有更多相关内容分享给大家学习,包括但不限于算法解析、编程技巧、面试准备等,欢迎访问学习。

推荐面试题