• 994. Rotting Oranges


    问题:

    橘子催熟问题,0:空地,1:新鲜橘子,2:成熟橘子

    每一分钟成熟橘子会催熟四周的新鲜橘子,但如果新鲜橘子四周空着,则不会被催熟。

    求给定数组情况,最多需要多久催熟所有的橘子,如果无法催熟所有则返回-1。

    Example 1:
    Input: [[2,1,1],[1,1,0],[0,1,1]]
    Output: 4
    
    Example 2:
    Input: [[2,1,1],[0,1,1],[1,0,1]]
    Output: -1
    Explanation:  The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.
    
    Example 3:
    Input: [[0,2]]
    Output: 0
    Explanation:  Since there are already no fresh oranges at minute 0, the answer is just 0.
     
    
    Note:
    1 <= grid.length <= 10
    1 <= grid[0].length <= 10
    grid[i][j] is only 0, 1, or 2.
    

      

    解法:

    图的广度优先搜索BFS。需要queue来存储同一阶层所有节点。

    同时进行更深一层搜索。

    应用至本问题,先遍历所有节点,找到成熟橘子2的节点,存入queue中。

    (可同时记录新鲜橘子 1 的个数cnt)

    接着,对queue中该阶层的每个元素进行展开,展开层数res++

    (由于之后不断加元素到queue,则需要记录当前queue的size,每进行size次后,则说明该展开下一阶层的queue)

    对每一个元素节点,向四个方向催熟,如果为 1 ,则催熟至 2 ,同时加入queue中。(进行一个1->2的转化,则cnt--<剩下为1的橘子数>)

    继续重复操作queue中所有元素,直到queue中为空。

    那么,如果cnt!=0,则催熟动作完成后,还剩下cnt个新鲜橘子,无法催熟,那么返回-1

    反之,则返回展开的层数res。

    代码参考:

     1 class Solution {
     2 public:
     3     int orangesRotting(vector<vector<int>>& grid) {
     4         int i, j, m, n, cnt=0, res=-1;
     5         queue<vector<int>> q;
     6         vector<vector<int>>dir={{-1,0},{1,0},{0,-1},{0,1}};
     7         n=grid.size();
     8         if(n==0) return 0;
     9         m=grid[0].size();
    10         for(i=0; i<n; i++){
    11             for(j=0; j<m; j++){
    12                 if(grid[i][j]==1) cnt++;
    13                 if(grid[i][j]==2) q.push({i,j});
    14             }
    15         }
    16         
    17         while(!q.empty()){
    18             res++;
    19             int qsize=q.size();
    20             for(int k=0; k<qsize; k++){
    21                 vector<int> cur=q.front();
    22                 q.pop();
    23                 for(i=0; i<4; i++){
    24                     int x=cur[0]+dir[i][0], y=cur[1]+dir[i][1];
    25                     if(x<0 || x>=n || y<0 || y>=m || grid[x][y]!=1) continue;
    26                     grid[x][y]=2;
    27                     q.push({x,y});
    28                     cnt--;
    29                 }
    30             }
    31         }
    32         if(cnt==0) return max(0,res);
    33         return -1;
    34     }
    35 };
  • 相关阅读:
    网站访问量大 怎样优化mysql数据库
    BootStrap 模态框禁用空白处点击关闭
    常用SQL语句
    诅咒JavaScript之----ArcGIS JavaScript 点聚合 ClusterLayer
    模态框与 天地图地图控件冲突
    FXK Javascript
    从列表中或数组中随机抽取固定数量的元素组成新的数组或列表
    wangEditor
    手把手教你用vue-cli构建一个简单的路由应用
    解决eclipse端口被占用的问题
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/12804085.html
Copyright © 2020-2023  润新知