classSolution{int ret,step;int m,n;boolean[][] vis;publicintuniquePathsIII(int[][] grid){m = grid.length;n = grid[0].length;vis =newboolean[m][n];int bx =0;int by =0;for(int i =0; i < m; i++)for(int j =0; j < n; j++){if(grid[i][j]==0) step++;elseif(grid[i][j]==1){bx = i;by = j;}}step +=2; vis[bx][by]=true;dfs(grid,bx,by,1);return ret;}int[] dx ={0,0,-1,1};int[] dy ={-1,1,0,0};publicvoiddfs(int[][] grid,int i,int j,int count){if(grid[i][j]==2){if(count == step) ret++;return;}for(int k =0; k <4; k++){int x = i + dx[k];int y = j + dy[k];if(x >=0&& x < m && y >=0&& y < n &&!vis[x][y]&& grid[x][y]!=-1){vis[i][j]=true;dfs(grid,x,y,count+1);vis[x][y]=false;}}}}