题目
- 腐烂的橘子
在给定的网格中,每个单元格可以有以下三个值之一:
值 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 。
提示:
1 <= grid.length <= 10
1 <= grid[0].length <= 10
grid[i][j] 仅为 0、1 或 2
解题思路
/*
* 思路:
* 先遍历数组找出腐烂橘子并入队其位置
* 然后出队每一个腐烂橘子
* “感染”四周的橘子,
* 如果位置越界就不操作,并将感染后的橘子进队
* 直到队空
* 最后遍历并返回结果
*/
代码
class Solution {
Queue<index> queue=new LinkedList<>();
class index{
int x;
int y;
int minute;
index(int a,int b,int c){
x=a;
y=b;
minute=c;
}
}
public int orangesRotting(int[][] grid) {
//bfs
int minutes=0;
int Px=grid.length;//行
int Py=grid[0].length;//列
for(int i=0;i<Px;i++) {
for(int j=0;j<Py;j++)
{
if(grid[i][j]==2)
queue.add(new index(i,j,minutes));
}
}//找到已被“感染”的橘子
while(!queue.isEmpty()) {
//出队
index cur=queue.remove();
minutes=cur.minute;
//找到界限并判断四周感染情况
beat(grid,cur.x,cur.y,cur.minute);
}
//遍历判断是否感染完全
for(int i=0;i<Px;i++) {
for(int j=0;j<Py;j++)
{
if(grid[i][j]==1)
return -1;
}
}//找到已被“感染”的橘子
return minutes;
}
private void beat(int[][] grid, int x, int y, int minute) {
//"感染"
Judge(grid,x-1,y,minute);
Judge(grid,x,y-1,minute);
Judge(grid,x,y+1,minute);
Judge(grid,x+1,y,minute);
}
private void Judge(int[][] grid, int x, int y, int minute) {
//感染操作
if((x>=0&&x<grid.length)&&(y>=0&&y<grid[0].length)){if(grid[x][y]==1) {
queue.add(new index(x,y,minute+1));
grid[x][y]=2;
}}
}
public void main(String[] args) {
//
int[][] grid= {{2,1,1},{1,1,0},{0,1,1}};
orangesRotting(grid);
}
}
第四天 √