ปัญหา
เราจำเป็นต้องเขียนฟังก์ชัน 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