LeetCode994 腐烂的橘子

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

值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

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

 

做广度优先搜索,先遍历记录下来新鲜橘子的个数,同时把腐烂橘子坐标都压入队列。用一个数组记录每个点的腐烂时间,初始腐烂的位0,其余全为-1。不断从队列中取出腐烂节点,判断上下左右四个节点,如果符合要求就把他腐烂掉,同时更新腐烂时间。等队列为空时判断还有没有新鲜橘子就可以了。

 1 class Solution {
 2 private:
 3     int dis[10][10];
 4     int dir_x[4]={0, 1, 0, -1};
 5     int dir_y[4]={1, 0, -1, 0};
 6 
 7 public:
 8     int orangesRotting(vector<vector<int>>& grid) {
 9         int row=grid.size();
10         if(!row)
11             return 0;
12         int col=grid[0].size();
13         int fresh=0;
14         int ans=0;
15         
16         queue<pair<int,int>> q;
17         for(int i=0;i<row;++i)
18             for(int j=0;j<col;++j){
19                 if(grid[i][j]==1)
20                     ++fresh;
21                 else if(grid[i][j]==2){
22                     q.push(make_pair(i,j));
23                 }
24                 dis[i][j]=grid[i][j]==2?0:-1;
25             }
26         if(!fresh)
27             return 0;
28         while(!q.empty()){
29             pair<int,int>pos=q.front();q.pop();
30             for(int i=0;i<4;++i){
31                 int tx=pos.first+dir_x[i];
32                 int ty=pos.second+dir_y[i];
33                 if(tx<0 || tx>=row || ty<0 || ty>=col || !grid[tx][ty] || dis[tx][ty]!=-1)
34                     continue;
35                 dis[tx][ty]=dis[pos.first][pos.second]+1;
36                 q.push(make_pair(tx,ty));
37                 --fresh;
38                 ans=dis[tx][ty];
39                 if(!fresh)
40                     break;
41             }
42         }
43         return fresh==0?ans:-1;
44     }
45 };

 

posted @ 2020-07-29 22:29  __rookie  阅读(200)  评论(0编辑  收藏  举报