题目描述:
在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
思路分析:
- 每分钟每个腐烂的橘子都会使其上下左右的新鲜橘子腐烂。队列中只让腐烂的橘子入队;
- 每次记录队列的长度,即为在同一时间内腐烂的橘子
- 出队时,让当前腐烂橘子四周的新鲜橘子都变为腐烂,直到队列为空
- 用 time 标记腐烂时间
- 最后检查网格中是否还有新鲜的橘子 有,返回 -1
class Solution {
public int orangesRotting(int[][] grid) {
Queue<Integer> q=new LinkedList<Integer>();
int time=0;
int rlen=grid.length;
int clen=grid[0].length;
for(int i=0;i<rlen;i++){
for(int j=0;j<clen;j++){
if(grid[i][j]==2){
int flag=i*clen+j;
q.offer(flag);
}
}
}
while(!q.isEmpty()){
time++;
int size=q.size();
while(size>0){
int aflag=q.poll();
int row=aflag/clen;
int col=aflag%clen;
if(row>0&&grid[row-1][col]==1){
grid[row-1][col]=2;
int flag=(row-1)*clen+col;
q.offer(flag);
}
if(col>0&&grid[row][col-1]==1){
grid[row][col-1]=2;
int flag=row*clen+col-1;
q.offer(flag);
}
if(row<rlen-1&&grid[row+1][col]==1){
grid[row+1][col]=2;
int flag=(row+1)*clen+col;
q.offer(flag);
}
if(col<clen-1&&grid[row][col+1]==1){
grid[row][col+1]=2;
int flag=row*clen+col+1;
q.offer(flag);
}
size--;
}
}
for(int i=0;i<rlen;i++){
for(int j=0;j<clen;j++){
if(grid[i][j]==1){
return -1;
}
}
}
return time==0?0:time-1;
}
}