import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param CityMap int整型二维数组 
     * @param n int整型 
     * @param m int整型 
     * @return int整型
     */
    TreeMap<Integer,Integer> map=new TreeMap<>();
    //方向数组
    int[] dx=new int[]{-1,1,0,0};
    int[] dy=new int[]{0,0,-1,1};
    public int countPath (int[][] CityMap, int n, int m) {
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                //找到经理位置,并进行深度优先搜索
                if(CityMap[i][j]==1){
                    dfs(CityMap,i,j,0,new boolean[n][m]);
                    break;
                }
            }
        }
        //返回map中第一个entry的值,也就是最短距离的方案数
        return map.firstEntry().getValue();
    }
     
    private void dfs(int[][] CityMap,int i,int j,int dist,boolean[][] v){
        int n=CityMap.length,m=CityMap[0].length;
        //越界、遇到障碍物、已经访问过、或者距离更大的情况,直接返回
        if(i<0||i>=n||j<0||j>=m||CityMap[i][j]==-1||v[i][j]||(map.size()>0&&dist>map.firstKey())){
            return;
        }
        //找到一条合法路径,加入到map
        if(CityMap[i][j]==2){
            map.put(dist,map.getOrDefault(dist,0)+1);
        }
        else{
            //更新标记数组
            v[i][j]=true;
            //往四个方向进行深度优先搜索
            for(int k=0;k<4;k++){
                dfs(CityMap,i+dx[k],j+dy[k],dist+1,v);
            }
            //回溯,将标记数组还原
            v[i][j]=false;
        }
    }
}