• 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;
        }
    };
    
  • 相关阅读:
    基础知识
    贪心-合并区间、交集、无重叠区间、俄罗斯套娃信封
    递归实现煎饼排序
    递归实现基本计算器+-*/()
    滑动窗口---最小覆盖子串、字母异位词、
    二分查找
    N皇后
    二叉搜索树-合法性、增、删、查
    循环
    二分法
  • 原文地址:https://www.cnblogs.com/casperwin/p/13728085.html
Copyright © 2020-2023  润新知