Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

กรณีศึกษา Zombie Apocalypse - JavaScript

ไวรัสซอมบี้ระบาดในเมืองดิจิทัล เราทำงานที่ 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 ]
]