ไวรัสซอมบี้ระบาดในเมืองดิจิทัล เราทำงานที่ CDC ดิจิทัล ต้องดูแผนที่เมืองและบอกพื้นที่ที่ติดเชื้อ เพื่อให้ทหารรู้จะวางระเบิดที่ไหน
ซอมบี้ดิจิทัลชนิดใหม่นี้เคลื่อนที่ได้เฉพาะแนวตั้งและแนวนอน และติดเชื้อเฉพาะตัวเลขที่เหมือนกัน
ได้รับอาร์เรย์ 2 มิติที่มีตัวเลข ผู้ป่วยคนแรก (patient zero) อยู่ที่มุมซ้ายบน ([0][0]) และเชื้อแพร่จากนั้นไปเซลล์อื่นๆ โดยเคลื่อนที่ซ้าย ขวา บน ล่าง
ต้องสร้างฟังก์ชันคืนค่าแผนที่ (2D array) ที่เครื่องหมายพื้นที่ติดเชื้อเป็น 1 และปลอดภัยเป็น 0
กล่าวคือ หา element ทั้งหมดที่มีค่าเท่ากับ [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 ] ]