class Solution {
int ans=0;
int sx,sy,ex,ey;
int cnt=1;
public int uniquePathsIII(int[][] grid) {
int len1=grid.length;
int len2=grid[0].length;
for(int i=0;i<len1;++i){
for(int j=0;j<len2;++j){
if(grid[i][j]==1){
sx=i;
sy=j;
}
else if(grid[i][j]==2){
ex=i;
ey=j;
}
else if(grid[i][j]==0){
cnt++;
}
}
}
dfs(grid,sx,sy);
return ans;
}
public void dfs(int[][] grid,int x,int y){
if(check(grid,x,y)==false){
return;
}
if(x==ex&&y==ey&&cnt==0){
ans++;
return;
}
cnt--;
grid[x][y]=-1;
dfs(grid,x+1,y);
dfs(grid,x,y+1);
dfs(grid,x-1,y);
dfs(grid,x,y-1);
cnt++;
grid[x][y]=0;
}
public boolean check(int[][] grid,int x,int y){
return x>=0&&x<grid.length&&y>=0&&y<grid[0].length&&grid[x][y]>=0;
}
}