30 Day Challenge Day 13 | Leetcode 980. Unique Paths III

题解

Hard | Backtracking/DFS

这道题使用标准的Backtracking套路,不难得解。一开始没有注意两点,导致错误:

  1. 起点不一定是在左上角的grid[0][0],而是需要根据条件找出来;
  2. 每一个非障碍位置都需要走一次,这就不同于之前的 Unique Paths 的题,有些格子可以不走,只要能到达终点即可。为了这个要求,需要另外跟踪一个变量 remain ,就是非障碍的格子的数量,只记录能经过所有这些格子的路径。

除去这两点,这道题还是中规中矩,作为 Hard 级别的题,稍显勉强。

class Solution {
public:
    int uniquePathsIII(vector<vector<int>>& grid) {
        if(grid.empty()) return 0;
        
        int start_x, start_y, count = 0, remain = 0;
        
        for(int i = 0; i < grid.size(); i++) {
            for(int j = 0; j < grid[0].size(); j++) {
                if(grid[i][j] >= 0) remain++;
                if(grid[i][j] == 1) {
                    start_x = i;
                    start_y = j;
                }
            }
        }
        
        vector<vector<bool>> visited(grid.size(), vector<bool>(grid[0].size(), false));
        
        helper(grid, start_x, start_y, visited, remain, count);
        
        return count;
    }
    
    void helper(vector<vector<int>>& grid, int x, int y, vector<vector<bool>>& visited, int remain, int& count) { 
        if(grid[x][y] == 2 && remain == 1) {
            count++;
            return;
        }

        visited[x][y] = true;
        
        int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        
        for(int i = 0; i < 4; i++) {
            int next_x = x + dirs[i][0];
            int next_y = y + dirs[i][1];
            
            if(next_x >= 0 && next_x < grid.size() && next_y >= 0 && next_y < grid[0].size()
              && grid[next_x][next_y] != -1 && !visited[next_x][next_y]) {
                helper(grid, next_x, next_y, visited, remain-1, count);
            }
        }
        
        visited[x][y] = false;
    }
};
原文地址:https://www.cnblogs.com/casperwin/p/13728085.html