腐烂的苹果

一个腐烂的苹果每分钟可以向上下左右四个方向扩展,扩展之后,又会有新的腐烂的苹果,一直去腐蚀好的苹果,求多少分钟后,网格中全是烂苹果。
第一次做这道题的时候,想到这道题考察的其实是多源BFS的知识点了。
多源BFS
把所有的源点当成一个超级源点。问题就变成了单一的单源最短路问题
将所有腐烂的苹果全部放到一个队列里面,然后层层的向外扩展,每次扩展都要把队列里面所有的烂苹果给pop出去。bfs搜索会把一个烂苹果周围的好苹果放入到队列里面,因为每分钟烂苹果都要向外扩展一次,所以队列里面的烂苹果向外扩展耗费的时间是同一分钟。
class Solution {
  public:
    int n, m;
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};
    queue<pair<int, int>> q;
    int rotApple(vector<vector<int> >& g) {
        // write code here
        n = g.size();
        m = g[0].size();
        // 将所有烂苹果当成一个大的烂苹果
        for (int i =   0; i < n; i ++) {
            for (int j =  0; j < m; j++) {
                if (g[i][j] == 2) {
                    q.push({i, j});
                }
            }
        }
        // 记录耗费的时间
        int ret = 0;
        while (!q.empty()) {
            
            // 每次扩展都要将队列清空
            int sz = q.size();
            ret++;
            while (sz--) {
                auto [i, j] = q.front();
                q.pop();
                for (int t = 0; t < 4; t++) {
                    int x = i + dx[t];
                    int y =  j + dy[t];
                    if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 1) {
                        // 遍历过的苹果不能在遍历到了,可以搞一个bool数组,也可以在原数组上进行修改
                        g[x][y] = 2;
                        // 好苹果加入到队列当中
                        q.push({x, y});
                    }
                }
            }
        }
        // 判断是否有苹果不能被腐蚀
        for (int i = 0; i < n; i++) 
            for (int j = 0; j < m; j++)
                if (g[i][j] == 1)
                        return -1;
        return ret - 1;
    }
};
                

















