Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

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: 
1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,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: [[1,0,0,0],[0,0,0,0],[0,0,0,2]]
Output: 4
Explanation: We have the following four paths: 
1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2),(2,3)
2. (0,0),(0,1),(1,1),(1,0),(2,0),(2,1),(2,2),(1,2),(0,2),(0,3),(1,3),(2,3)
3. (0,0),(1,0),(2,0),(2,1),(2,2),(1,2),(1,1),(0,1),(0,2),(0,3),(1,3),(2,3)
4. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2),(2,3)

Example 3:

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. 1 <= grid.length * grid[0].length <= 20

Companies:
LimeBike

Related Topics:
Backtracking, Depth-first Search

Similar Questions:

Solution 1. DFS

// OJ: https://leetcode.com/problems/unique-paths-iii/
// Author: github.com/lzl124631x
// Time: O(4^(MN))
// Space: O(MN)
class Solution {
private:
    int ans = 0, target = 0, visited = 0, M, N;
    int dirs[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
    void dfs(vector<vector<int>>& grid, int x, int y) {
        if (grid[x][y] == 2) {
            if (visited == target) ++ans;
            return;
        }
        ++visited;
        grid[x][y] = -1;
        for (auto dir : dirs) {
            int i = x + dir[0], j = y + dir[1];
            if (i < 0 || i >= M || j < 0 || j >= N || grid[i][j] == -1) continue;
            dfs(grid, i, j);
        }
        grid[x][y] = 0;
        --visited;
    }
public:
    int uniquePathsIII(vector<vector<int>>& grid) {
        M = grid.size();
        N = grid[0].size();
        int x, y;
        for (int i = 0; i < M; ++i) {
            for (int j = 0; j < N; ++j) {
                if (grid[i][j] == 1) {
                    x = i;
                    y = j;
                    ++target;
                } else if (!grid[i][j]) ++target;
            }
        }
        dfs(grid, x, y);
        return ans;
    }
};