僵尸末日案例研究 - JavaScript
一种恶性的僵尸病毒正在数字城市中蔓延。我们在数字疾病控制与预防中心工作,我们的工作是查看城市地图,并确定哪些区域受到僵尸病毒污染,以便数字军队知道在哪里投放炸弹。
它们是一种新型的数字僵尸,只能在垂直和水平方向移动,并且只能感染与自身相同的数字。
我们将得到一个包含数字的二维数组。
由于某种神秘的原因,零号病人总是出现在城市的西北区域(矩阵的元素 [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 ] ]
广告