广度优先搜索(BFS)

直接上题目

Leetcode题目:腐烂的橘子

在给定的网格中,每个单元格可以有以下三个值之一:

    值 0 代表空单元格;
    值 1 代表新鲜橘子;
    值 2 代表腐烂的橘子。

每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。

分析-----广度优先搜索的基本思路

  1. 初始化队列,最开始的坏橘子全部入队。
  2. 将队列里的坏橘子周围全部黑化(上下左右),将黑化后的坏橘子入队。
  3. 如果队列不为空,说明这一次有黑化,step+1;
  4. 如果队列为空,说明这一次没有任何橘子黑化,end;

代码

int orangesRotting(vector> &grid) {
    int min = 0, fresh = 0;
    queue> rot;
    for (int i = 0; i < grid.size(); i++) {
        for (int j = 0; j < grid[0].size(); j++)
            if (grid[i][j] == 1) fresh++;
            else if (grid[i][j] == 2) rot.push({i, j});
    }
    vector> nxt = {{-1, 0},
                                  {1,  0},
                                  {0,  -1},
                                  {0,  1}};
    while (!rot.empty()) {
        int n = rot.size();
        int col= grid.size();
        int row=grid[0].size();
        for (int i = 0; i < n; i++) {
            auto x = rot.front();
            rot.pop();
            for (auto cur: nxt) {
                int i = x.first + cur.first;
                int j = x.second + cur.second;
                if (i >= 0 && i < col && j >= 0 && j < row && grid[i][j] == 1) {
                    grid[i][j] = 2;
                    rot.push({i, j});
                    fresh--;
                }
            }
        }
        if (!rot.empty()) min++;
    }
    //最后判断是否仍存在新鲜橘子
    return fresh ? -1 : min;
}

你可能感兴趣的:(数论)