import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型ArrayList<ArrayList<>> 
     * @return int整型
     */

      
    public int rotApple (ArrayList<ArrayList<Integer>> grid) {
        //上下左右
       int []dx={0,0,-1,1};
       int []dy={-1,1,0,0};
       int ret=0;
       int m=grid.size();
       int n=grid.get(0).size();
       boolean vis[][]=new boolean[m][n];
       LinkedList<int []>queue=new LinkedList<>();
       for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(grid.get(i).get(j)==2){
                queue.add(new int[]{i,j});
            }
        }
       }
       while(!queue.isEmpty()){
          int sz=queue.size();
          while(sz--!=0){
            int []t=queue.poll();
            int a=t[0],b=t[1];//x,y
            for(int i=0;i<4;i++){
                int x=a+dx[i],y=b+dy[i];
                if(x>=0&&x<m&&y>=0&&y<n&&!vis[x][y]&&grid.get(x).get(y)==1){
                    vis[x][y]=true;
                    queue.add(new int[]{x,y});
                }
            }
          }
          ret++;
       }
       for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(grid.get(i).get(j)==1&&!vis[i][j]){
                return -1;
            }
        }
       }

        return ret-1;
    }
}