//C++ class Solution { int cnt; int dis[10][10]; int dir_x[4] = {0, 1, 0, -1}; int dir_y[4] = {1, 0, -1, 0}; public: int orangesRotting(vector<vector<int>>& grid) { queue<pair<int, int>>Q; memset(dis, -1, sizeof(dis)); cnt = 0; int n = (int)grid.size(), m = (int)grid[0].size(), ans = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (grid[i][j] == 2) { Q.emplace(i, j); dis[i][j] = 0; } else if (grid[i][j] == 1) { cnt += 1; } } } while (!Q.empty()){ auto [r, c] = Q.front(); Q.pop(); for (int i = 0; i < 4; ++i) { int tx = r + dir_x[i]; int ty = c + dir_y[i]; if (tx < 0|| tx >= n || ty < 0|| ty >= m || ~dis[tx][ty] || !grid[tx][ty]) { continue; } dis[tx][ty] = dis[r][c] + 1; Q.emplace(tx, ty); if (grid[tx][ty] == 1) { cnt -= 1; ans = dis[tx][ty]; if (!cnt) { break; } } } } return cnt ? -1 : ans; } };
//Java class Solution { int[] dr = new int[]{-1, 0, 1, 0}; int[] dc = new int[]{0, -1, 0, 1};
public int orangesRotting(int[][] grid) { int R = grid.length, C = grid[0].length; Queue<Integer> queue = new ArrayDeque<Integer>(); Map<Integer, Integer> depth = new HashMap<Integer, Integer>(); for (int r = 0; r < R; ++r) { for (int c = 0; c < C; ++c) { if (grid[r][c] == 2) { int code = r * C + c; queue.add(code); depth.put(code, 0); } } } int ans = 0; while (!queue.isEmpty()) { int code = queue.remove(); int r = code / C, c = code % C; for (int k = 0; k < 4; ++k) { int nr = r + dr[k]; int nc = c + dc[k]; if (0 <= nr && nr < R && 0 <= nc && nc < C && grid[nr][nc] == 1) { grid[nr][nc] = 2; int ncode = nr * C + nc; queue.add(ncode); depth.put(ncode, depth.get(code) + 1); ans = depth.get(ncode); } } } for (int[] row: grid) { for (int v: row) { if (v == 1) { return -1; } } } return ans; } }