僵尸末日案例研究 - JavaScript

javascriptweb developmentfront end technologyobject oriented programming更新于 2026/1/1 1:16:17

一种可怕的僵尸病毒正在数字城市中蔓延。我们在数字疾病预防控制中心工作,我们的工作是查看城市地图,找出哪些区域被僵尸病毒污染,这样数字军队就知道在哪里投下炸弹。

它们是新型的数字僵尸,只能在垂直和水平方向上移动,并且只感染与它们相同的数字。

我们将获得一个包含数字的二维数组。

由于某种神秘的原因,零号病人总是出现在城市的西北地区(矩阵元素 [0][0]),瘟疫从那里通过向左、向右、向上或向下移动传播到其他单元格。

我们必须创建一个函数,该函数返回一个地图(二维数组),其中所有受污染区域标记为 1,无病毒区域标记为 0。

换句话说,我们必须找到所有具有与 [0][0] 相同值并且我们可以通过向下、向上、向右或向下移动到达的矩阵元素。从 [0][0] 开始 - 不进入存储任何其他值的字段。

示例

以下是代码 −

const arr = [
   [9, 1, 2, 3, 4, 1, 2, 9],
   [9, 9, 9, 2, 1, 5, 9, 9],
   [9, 2, 9, 3, 7, 9, 1, 9],
   [6, 9, 9, 9, 0, 9, 2, 9],
   [5, 4, 3, 9, 9, 9, 4, 9],
   [9, 3, 9, 5, 8, 9, 9, 9],
   [9, 9, 9, 9, 9, 9, 7, 9],
   [9, 9, 1, 2, 3, 9, 8, 9]
];
const findZombies = arr => {
   let i, j, result = [],
   zombie = arr[0][0],
   tree = {};
   const chance = ([i, j]) => {
      if (!tree[i] || !tree[i][j]) return;
      result[i][j] = 1;
      var temp = tree[i][j];
      tree[i][j] = undefined;
      temp.forEach(chance);
   }
   for (i = 0; i < arr.length; i++) {
      result.push([]);
      for (j = 0; j < arr[i].length; j++) {
         result[i].push(0);
         if (arr[i][j] !== zombie) continue;
         if (!tree[i]) tree[i] = {};
         tree[i][j] = [[i, j - 1], [i, j + 1], [i - 1, j], [i + 1, j]].filter(([x, y]) => arr[x] && arr[x][y] === zombie);
      };
   };
   chance([0, 0]);
   return result;
};
console.log(findZombies(arr));

这将在控制台上产生以下输出 −

[
 [
   1, 0, 0, 0,
   0, 0, 0, 1
 ],
 [
   1, 1, 1, 0,
   0, 0, 1, 1
 ],
 [
   1, 0, 1, 0,
   0, 1, 0, 1
 ],
 [
   0, 1, 1, 1,
   0, 1, 0, 1
 ],
 [
   0, 0, 0, 1,
   1, 1, 0, 1
 ],
 [
   1, 0, 1, 0,
   0, 1, 1, 1
 ],
 [
   1, 1, 1, 1,
   1, 1, 0, 1
 ],
 [
   1, 1, 0, 0,
   0, 1, 0, 1
 ]
]

相关文章


有用资源