994. Rotting Oranges

Last updated

Last updated
Input: [[2,1,1],[1,1,0],[0,1,1]]
Output: 4Input: [[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.Input: [[0,2]]
Output: 0
Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.// BFS
int orangesRotting(vector<vector<int>>& grid) {
if (grid.empty() || grid[0].empty()) return 0;
int m = grid.size(), n = grid[0].size(), fresh_cnt = 0;
queue<pair<int, int> > q;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] == 1) ++fresh_cnt;
else if (grid[i][j] == 2) q.emplace(i, j);
}
}
if (fresh_cnt == 0) return 0;
int res = 0;
vector<vector<int> > dirs({{-1, 0}, {1, 0}, {0, -1}, {0, 1}});
while (!q.empty() && fresh_cnt) {
int sz = q.size();
for (int k = 0; k < sz; ++k) {
auto pt = q.front(); q.pop();
for (auto dir : dirs) {
int r = pt.first + dir[0];
int c = pt.second + dir[1];
if (r < 0 || r >= m || c < 0 || c >= n || grid[r][c] != 1) continue;
grid[r][c] = 2;
--fresh_cnt;
q.emplace(r, c);
}
}
++res;
}
return fresh_cnt == 0 ? res : -1;
}