Unique Paths III

LeetCode Q 980 - Unique Paths III

On a 2-dimensional grid, there are 4 types of squares:

  • 1 represents the starting square. There is exactly one starting square.
  • 2 represents the ending square. There is exactly one ending square.
  • 0 represents empty squares we can walk over.
  • -1 represents obstacles that we cannot walk over.
    Return the number of 4-directional walks from the starting square to the ending square, that walk over every non-obstacle square exactly once.

Example 1: Input: [[1,0,0,0],[0,0,0,0],[0,0,2,-1]] ; Output: 2
Explanation: We have the following two paths:

  • (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2)
  • (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2)

Example 2: Input: [[0,1],[2,0]] ; Output: 0
Explanation: There is no path that walks over every empty square exactly once. Note that the starting and ending square can be anywhere in the grid.

Note: 1 <= grid.length * grid[0].length <= 20

Solution

Code:

private static final int[] DIRS = {-1, 0, 1, 0, -1};
private int res = 0;
public int uniquePathsIII(int[][] grid) {
  
  int R = grid.length, C = grid[0].length;
  int zeros = 0, startX = 0, startY = 0, endX = 0, endY = 0;
  
  for (int r = 0; r < R; r++) {
    for (int c = 0; c < C; c++) {
      if (grid[r][c] == 0) zeros++;
      if (grid[r][c] == 1) { startX = r; startY = c; }
      if (grid[r][c] == 2) { endX = r; endY = c; }
    }
  }
  
  backtrack(grid, startX, startY, endX, endY, 0, zeros);

  return res;
}

private void backtrack(int[][] grid, int currX, int currY, 
                     int endX, int endY, int count, int zeros) {
  if (currX == endX && currY == endY && count == zeros + 1) {
    res++; return;
  }
  
  for (int i = 0; i < 4; i++) {
    int nx = currX + DIRS[i], ny = currY + DIRS[i + 1];
    if (nx < 0 || ny < 0 || nx >= grid.length || ny >= grid[0].length || grid[nx][ny] == -1 || grid[nx][ny] == 1) continue;
    
    int ori = grid[nx][ny];
    grid[nx][ny] = -1; count++;
    backtrack(grid, nx, ny, endX, endY, count, zeros);
    grid[nx][ny] = ori; count--;
  }
}

   Reprint policy


《Unique Paths III》 by Tong Shi is licensed under a Creative Commons Attribution 4.0 International License
  TOC