在給定的網(wǎng)格中光涂,每個(gè)單元格可以有以下三個(gè)值之一:
- 值
0
代表空單元格延柠; - 值
1
代表新鮮橘子巫击; - 值
2
代表腐爛的橘子棱貌。
每分鐘玖媚,任何與腐爛的橘子(在 4 個(gè)正方向上)相鄰的新鮮橘子都會(huì)腐爛。
返回直到單元格中沒(méi)有新鮮橘子為止所必須經(jīng)過(guò)的最小分鐘數(shù)婚脱。如果不可能今魔,返回 -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 列)永遠(yuǎn)不會(huì)腐爛错森,因?yàn)楦癄€只會(huì)發(fā)生在 4 個(gè)正向上吟宦。
示例 3:
輸入:[[0,2]]
輸出:0
解釋:因?yàn)?0 分鐘時(shí)已經(jīng)沒(méi)有新鮮橘子了,所以答案就是 0 涩维。
提示:
1 <= grid.length <= 10
1 <= grid[0].length <= 10
-
grid[i][j]
僅為0
殃姓、1
或2
思路:為了省事,直接用|=4
標(biāo)記馬上要腐爛的橘子.
class Solution {
private static final int[] dx = new int[]{0,0,1,-1};
private static final int[] dy = new int[]{1,-1,0,0};
public int orangesRotting(int[][] grid) {
int length1 = grid.length, length2 = grid[0].length;
int minutes = 0 , rotting = 4;
boolean change = true ,allRotting = true;
while(change){
change = false; // 初始化為false
for(int i = 0;i < length1;i++){
for(int j = 0 ;j < length2;j++){
if( grid[i][j] == 2 ){
for(int k = 0;k < 4;k++){
int x = i + dx[k];
int y = j + dy[k];
if(x >= 0 && x < length1 && y >= 0 && y < length2 && grid[x][y] == 1){
grid[x][y] |= rotting;
}
}
}
}
}
for(int i = 0;i < length1; i++){
for(int j = 0; j < length2; j++){
if( (grid[i][j] & rotting) != 0 ){
change = true;
grid[i][j] = 2;
}
}
}
if(change) minutes++; //如果腐爛了瓦阐,添加時(shí)間
}
for(int i = 0; i < length1; i++){
for(int j = 0; j < length2; j++){
if( grid[i][j] == 1)
allRotting = false;
}
}
return allRotting == false ? -1 : minutes;
}
}