1. Round-by-Round Grid Simulation
Intuition
In each round, scan the entire grid. For every rotten orange, identify fresh neighbors and mark them as newly rotten in a next-state grid. Repeat until a round produces no new rotten oranges.
Algorithm
- Initialize minutes = 0.
- Loop indefinitely:
- Create nextGrid = copy of grid, changed = false.
- Scan all (r, c):
- If grid[r][c] == 2:
- Check 4 neighbors (nr, nc):
- If grid[nr][nc] == 1:
- nextGrid[nr][nc] = 2, changed = true.
- If !changed: break.
- grid = nextGrid, minutes++.
- Check if any cell in grid has value 1: if so return -1, else return minutes.
#include <iostream>#include <vector> class Solution {public: int orangesRotting(std::vector<std::vector<int>>& grid) { int m = grid.size(); int n = grid[0].size(); int minutes = 0; int dr[] = {-1, 1, 0, 0}; int dc[] = {0, 0, -1, 1}; while (true) { std::vector<std::vector<int>> nextGrid = grid; bool changed = false; for (int r = 0; r < m; ++r) { for (int c = 0; c < n; ++c) { if (grid[r][c] == 2) { for (int k = 0; k < 4; ++k) { int nr = r + dr[k]; int nc = c + dc[k]; if (nr >= 0 && nr < m && nc >= 0 && nc < n && grid[nr][nc] == 1) { nextGrid[nr][nc] = 2; changed = true; } } } } } if (!changed) break; grid = std::move(nextGrid); minutes++; } for (int r = 0; r < m; ++r) { for (int c = 0; c < n; ++c) { if (grid[r][c] == 1) return -1; } } return minutes; }}; int main() { Solution sol; std::vector<std::vector<int>> grid = { {2, 1, 1}, {1, 1, 0}, {0, 1, 1} }; std::cout << "Simulation Minutes: " << sol.orangesRotting(grid) << " (Expected: 4)\n"; return 0;}Time & Space Complexity
- Time complexity:
O((m * n)^2) - Space complexity:
O(m * n)