public class Solution {
private int totalEmpty = 1;
private int result = 0;
private int rows, cols;
public int uniquePathsIII(int[][] grid) {
int startX = 0, startY = 0;
rows = grid.length;
cols = grid[0].length;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (grid[i][j] == 0) {
totalEmpty++;
} else if (grid[i][j] == 1) {
startX = i;
startY = j;
}
}
}
dfs(grid, startX, startY, 0);
return result;
}
private void dfs(int[][] grid, int x, int y, int count) {
if (x < 0 || y < 0 || x >= rows || y >= cols || grid[x][y] == -1) {
return;
}
if (grid[x][y] == 2) {
if (count == totalEmpty) {
result++;
}
return;
}
int temp = grid[x][y];
grid[x][y] = -1;
dfs(grid, x + 1, y, count + 1);
dfs(grid, x - 1, y, count + 1);
dfs(grid, x, y + 1, count + 1);
dfs(grid, x, y - 1, count + 1);
grid[x][y] = temp;
}
}