994. 腐烂的橘子

class Solution {
    int cnt;
    int dis[12][12];
    int dx[4] = {1, 0, -1, 0};
    int dy[4] = {0, 1, 0, -1};
public:
    int orangesRotting(vector<vector<int>>& grid) {
        queue<pair<int, int> > Q;
        while(!Q.empty()) Q.pop();
        memset(dis, -1, sizeof dis);
        cnt = 0;
        int ans = 0;
        int n = grid.size(), m = grid[0].size();
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(grid[i][j] == 2) {
                    Q.push(make_pair(i, j));
                    dis[i][j] = 0;
                }
                else if(grid[i][j] == 1) cnt++;
            }
        }
        while(!Q.empty()) {
            pair<int, int> P = Q.front();
            Q.pop();
            int x = P.first, y = P.second;
            for(int i = 0; i < 4; i++) {
                int tx = x + dx[i];
                int ty = y + dy[i];
                if(tx < 0 || tx >= n || ty < 0 || ty >= m || ~dis[tx][ty] || !grid[tx][ty]) continue;
                dis[tx][ty] = dis[x][y] + 1;
                Q.push(make_pair(tx, ty));
                if(grid[tx][ty] == 1) {
                    cnt--;
                    ans = dis[tx][ty];
                    if(!cnt) break;
                }
            }
        }
        return cnt ? -1 : ans;
    }
};

多源BFS,把初始时腐烂的橘子全部先加入队列。

用cnt记录当前新鲜的橘子数,每腐烂一个,cnt--,如果这个值变为0,说明都被腐烂了。

用dis记录对应橘子腐烂的时间,如果~dis[i][j为真,说明dis[i][j] != -1,不是初始化dis数组时的值,说明该点已经被访问过,所以跳过。

posted on 2021-03-03 10:45  hannah_id  阅读(97)  评论(0)    收藏  举报

导航