【每日打卡】Day19:腐烂的橘子 C++实现

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40184885/article/details/89933893

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

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

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

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

示例 1:

 

输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4

示例 2:

输入:[[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。

示例 3:

输入:[[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

代码:

class Solution {
public:
    int ans = 0;
    int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1};
    //队列用于BFS搜索,map用于存储每个正常橘子被感染所需要的次数
    queue<int> q; map<int,int> depth;
    void bfs(vector<vector<int>>& grid){
        int rs = grid.size(), cs = grid[0].size();
        for(int i = 0; i < rs; i ++)
            for(int j = 0; j < cs; j ++){
                if(grid[i][j] == 2){
                    //思想为将二维数组转化为一维,方便队列存储
                    q.push(i*cs+j);
                    depth[i*cs+j] = 0;
                }
            }
       while(!q.empty()){
           int temp = q.front();
           q.pop();
            //将一维的坐标转换成二维坐标
           int x = temp / cs, y = temp % cs;
           for(int i = 0; i < 4; i ++){
               int nx = x + dx[i], ny = y + dy[i];
               if(nx < 0 || ny < 0 || nx >= rs || ny >= cs || grid[nx][ny] != 1)
                   continue;
               q.push(nx*cs+ny);
                //感染正常橘子
               grid[nx][ny] = 2;
                //depth + 1
               depth[nx*cs+ny] = depth[x*cs+y] + 1;
               ans = depth[nx*cs+ny];
           }
       } 
        //当按照规则全部感染后 若还有正常橘子  则将ans置为-1
       for(int i = 0; i < rs; i ++)
           for(int j = 0; j < cs; j ++)
               if(grid[i][j] == 1){
                    ans = -1;
                    break;
                }
    }
    
    int orangesRotting(vector<vector<int>>& grid) {
        //务必判断grid是否为空
        if(grid.empty())
            return 0;
        bfs(grid);
        return ans;
        
    }
};

 

展开阅读全文

没有更多推荐了,返回首页