Сложность: medium
Дан m x n сетка, где каждая ячейка может иметь одно из трех значений:
0, представляющее пустую ячейку,
1, представляющее свежий апельсин,
2, представляющее гнилой апельсин.
Каждую минуту любой свежий апельсин, который находится в 4-х направленно смежной ячейке с гнилым апельсином, становится гнилым.
Верните минимальное количество минут, которые должны пройти, пока в ячейке не останется свежих апельсинов. Если это невозможно, верните -1.
Пример:
Input: grid = [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.
👨💻 Алгоритм:
1⃣Инициализация очереди и подсчет апельсинов:
Пройдите по всей сетке, добавьте все гнилые апельсины в очередь и подсчитайте общее количество свежих апельсинов.
Если нет свежих апельсинов, верните 0.
2⃣Использование BFS для распространения гнили:
Выполняйте BFS, начиная с всех гнилых апельсинов, добавленных в очередь.
Каждый раз, когда апельсин становится гнилым, уменьшайте счетчик свежих апельсинов.
Если свежих апельсинов больше не осталось, верните текущее количество минут.
3⃣Проверка оставшихся свежих апельсинов:
Если после завершения BFS все еще остаются свежие апельсины, верните -1.
😎 Решение:
class Solution {
function orangesRotting($grid) {
$queue = [];
$freshCount = 0;
$minutes = 0;
$directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];
for ($i = 0; $i < count($grid); $i++) {
for ($j = 0; $j < count($grid[0]); $j++) {
if ($grid[$i][$j] == 2) {
$queue[] = [$i, $j];
} elseif ($grid[$i][$j] == 1) {
$freshCount++;
}
}
}
if ($freshCount == 0) return 0;
while (count($queue) > 0) {
$size = count($queue);
for ($i = 0; $i < $size; $i++) {
list($x, $y) = array_shift($queue);
foreach ($directions as $dir) {
$nx = $x + $dir[0];
$ny = $y + $dir[1];
if ($nx >= 0 && $nx < count($grid) && $ny >= 0 && $ny < count($grid[0]) && $grid[$nx][$ny] == 1) {
$grid[$nx][$ny] = 2;
$freshCount--;
$queue[] = [$nx, $ny];
}
}
}
if (count($queue) > 0) {
$minutes++;
}
}
return $freshCount == 0 ? $minutes : -1;
}
}Ставь 👍 и забирай 📚 Базу знаний