import java.util.*;
/**
* NC398 腐烂的苹果
* @author d3y1
*/
public class Solution {
private int ROW;
private int COL;
private int[] dx = new int[]{0, 1, 0, -1};
private int[] dy = new int[]{1, 0, -1, 0};
private int result = -1;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 程序入口
*
* @param grid int整型ArrayList<ArrayList<>>
* @return int整型
*/
public int rotApple (ArrayList<ArrayList<Integer>> grid) {
ROW = grid.size();
COL = grid.get(0).size();
bfs(grid);
// bfs遍历后 检查是否仍然有完好的苹果
for(int i=0; i<ROW; i++){
for(int j=0; j<COL; j++){
if(grid.get(i).get(j) == 1){
return -1;
}
}
}
return result;
}
/**
* bfs
* @param grid
*/
private void bfs(ArrayList<ArrayList<Integer>> grid){
Queue<Step> queue = new LinkedList<>();
for(int i=0; i<ROW; i++){
for(int j=0; j<COL; j++){
// rotten apples at the beginning
if(grid.get(i).get(j) == 2){
queue.offer(new Step(i, j));
}
}
}
int size;
int level = -1;
Step curr;
int nextX,nextY;
while(!queue.isEmpty()){
size = queue.size();
level++;
while(size-- > 0){
curr = queue.poll();
for(int i=0; i<4; i++){
nextX = curr.x + dx[i];
nextY = curr.y + dy[i];
if(isValid(nextX, nextY)){
if(grid.get(nextX).get(nextY) == 1){
grid.get(nextX).set(nextY, 2);
queue.offer(new Step(nextX, nextY));
}
}
}
}
}
result = level;
}
/**
* 是否合法(是否越界)
* @param x
* @param y
* @return
*/
private boolean isValid(int x, int y){
if(x<0 || x>=ROW || y<0 || y>=COL){
return false;
}
return true;
}
/**
* 苹果坐标
*/
private class Step {
int x;
int y;
public Step(int x, int y){
this.x = x;
this.y = y;
}
}
}