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

ปัญหา: เวลาที่มะเขือเทศเน่าใน JavaScript


ปัญหา

เราต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ 2 มิติของตัวเลข arr เป็นอาร์กิวเมนต์เดียว

ตัวเลขในอาร์เรย์อาจเป็น:

  • ค่า 0 แทนเซลล์ว่าง;

  • ค่า 1 แทนมะเขือเทศสด;

  • ค่า 2 แทนมะเขือเทศเน่า

ทุกนาที มะเขือเทศสดที่อยู่ติดกัน (4 ทิศทาง) กับมะเขือเทศเน่าจะกลายเป็นเน่า

ฟังก์ชันควรคืนจำนวนนาทีขั้นต่ำที่ต้องรอจนไม่มีเซลล์ไหนมีมะเขือเทศสด หากเป็นไปไม่ได้ ให้คืน -1

ตัวอย่างเช่น หากอินพุตคือ

const arr = [ 
  [2, 1, 1], 
  [1, 1, 0], 
  [0, 1, 1] ];

ผลลัพธ์ควรเป็น

const output = 4;

คำอธิบายผลลัพธ์

เวลาที่ผ่านไปสถานะมะเขือเทศ
1
[ [2, 2, 1], [2, 1, 0], [0, 1, 1] ]
2
[ [2, 2, 2], [2, 2, 0], [0, 1, 1] ]
3
[ [2, 2, 2], [2, 2, 0], [0, 2, 1] ]
4
[ [2, 2, 2], [2, 2, 0], [0, 2, 2] ]

ตัวอย่างโค้ด

const arr = [ 
  [2, 1, 1], 
  [1, 1, 0], 
  [0, 1, 1] ]; 
const timeToRot = (arr = []) => {
  let fresh = 0;
  let count = -1;
  let curr = [];
  for(let i = 0; i < arr.length; i++){
    for(let j = 0; j < arr[i].length; j++){
      if(arr[i][j] === 1){
        fresh += 1;
      }
      if(arr[i][j] === 2){
        curr.push([i, j]);
      }
    }
  }
  if(!fresh){
    return 0;
  }
  while(curr.length > 0){
    count += 1;
    const next = [];
    const rotten = (i, j) => {
      arr[i][j] = 2;
      next.push([i, j]);
      fresh -= 1;
    };
    for(const [i, j] of curr){
      if (arr[i - 1] && arr[i - 1][j] === 1) {
        rotten(i - 1, j);
      }
      if (arr[i + 1] && arr[i + 1][j] === 1) {
        rotten(i + 1, j);
      }
      if (arr[i][j - 1] === 1) {
        rotten(i, j - 1);
      }
      if (arr[i][j + 1] === 1) {
        rotten(i, j + 1);
      }
    }
    curr = next;
  }
  return fresh === 0 ? count : -1;
};
console.log(timeToRot(arr));

ผลลัพธ์

ผลลัพธ์ในคอนโซลจะเป็น

4