import java.util.*;
/**
* NC398 腐烂的苹果
* @author d3y1
*/
public class Solution {
// 行列
private int n,m;
// 是否访问过
private boolean[][] isVisited;
// dx dy; 上下左右 四个方向
private int[] dx = new int[]{-1, 1, 0, 0};
private int[] dy = new int[]{0, 0, 1, -1};
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param grid int整型ArrayList<ArrayList<>>
* @return int整型
*/
public int rotApple (ArrayList<ArrayList<Integer>> grid) {
return solution(grid);
}
/**
* bfs
* @param grid
* @return
*/
private int solution(ArrayList<ArrayList<Integer>> grid){
n = grid.size();
m = grid.get(0).size();
isVisited = new boolean[n][m];
Queue<Loc> queue = new LinkedList<>();
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(grid.get(i).get(j) == 2){
queue.offer(new Loc(i, j));
isVisited[i][j] = true;
}
}
}
int size;
Loc loc,next;
int nextRow,nextCol;
int minute = -1;
while(!queue.isEmpty()){
size = queue.size();
while(size-- > 0){
loc = queue.poll();
for(int i=0; i<4; i++){
nextRow = loc.row+dx[i];
nextCol = loc.col+dy[i];
if(isLocValid(nextRow, nextCol) && !isVisited[nextRow][nextCol]){
isVisited[nextRow][nextCol] = true;
if(grid.get(nextRow).get(nextCol) == 1){
grid.get(nextRow).set(nextCol, 2);
queue.offer(new Loc(nextRow, nextCol));
}
}
}
}
minute++;
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(grid.get(i).get(j) == 1){
return -1;
}
}
}
return minute;
}
/**
* 校验位置是否合法
* @param row
* @param col
* @return
*/
private boolean isLocValid(int row, int col){
if((0<=row&&row<n) && (0<=col&&col<m)){
return true;
}
return false;
}
/**
* 腐烂苹果位置
*/
private class Loc {
int row;
int col;
public Loc(int row, int col){
this.row = row;
this.col = col;
}
}
}