題目描述
In a given grid, each cell can have one of three values:
- the value
0
representing an empty cell; - the value
1
representing a fresh orange; - the value
2
representing a rotten orange.
Every minute, any fresh orange that is adjacent (4-directionally) to a rotten orange becomes rotten.
Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1
instead.
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 only0
,1
, or2
.
解析
這裏不需要另外設一個inq數組來標記是否入過隊,只需要將入隊的位置的值設爲2即可。
struct node{
int x,y;
};
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
int m=grid.size(),n=grid[0].size(),num=0;
queue<node> q;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==2) q.push({i,j});
if(grid[i][j]==1) num++; //好橘子個數
}
}
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; //增量數組
int ans=0;
while(!q.empty()&&num>0){
ans++;
int cnt=q.size();
while(cnt--){ //逐層的BFS
node now=q.front();
q.pop();
for(int i=0;i<4;i++){
int newx=now.x+dx[i],newy=now.y+dy[i];
if(newx>=0&&newx<m&&newy>=0&&newy<n&&grid[newx][newy]==1){
grid[newx][newy]=2;num--;q.push({newx,newy});
}
}
}
}
return num>0?-1:ans; //如果q.empty()滿足了,跳出循環,但num>0說明無法全部腐爛
}
};