leetcode 980. 不同路径 III(图解)

在二维网格 grid 上,有 4 种类型的方格:

1 表示起始方格。且只有一个起始方格。
2 表示结束方格,且只有一个结束方格。
0 表示我们可以走过的空方格。
-1 表示我们无法跨越的障碍。
返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目,每一个无障碍方格都要通过一次。

示例 1:

输入:[[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
输出:2
解释:我们有以下两条路径:

  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)
    示例 2:

输入:[[1,0,0,0],[0,0,0,0],[0,0,0,2]]
输出:4
解释:我们有以下四条路径:

  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)
    示例 3:

输入:[[0,1],[2,0]]
输出:0
解释:
没有一条路能完全穿过每一个空的方格一次。
请注意,起始和结束方格可以位于网格中的任意位置。

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路分析

典型的DFS算法的运用,因为需要将所有的空白格(0)走完,那么我们需要先计算出表格中一共有多少0格,代码中用step表示需要走的步数,也就是在0格个数上加一,这个很显然。
其次,就是题目中没有告诉出发点的坐标,需要进行先前的遍历找到位置开始坐标。
最后,就是DFS实现的步骤:

临界条件:
leetcode 980. 不同路径 III(图解)_第1张图片
找到终结点:
leetcode 980. 不同路径 III(图解)_第2张图片
除去上面临界条件:
leetcode 980. 不同路径 III(图解)_第3张图片


代码解析

class Solution {
     
    int dfs(vector<vector<int>>& grid,int x,int y,int step){
     
        if(x < 0 || x >= grid.size() || y < 0 || y >= grid[x].size() || grid[x][y] == -1)
            return 0;
        if(grid[x][y] == 2)
            return step == 0 ? 1 : 0;
        grid[x][y] = -1;
        int sum = dfs(grid,x - 1,y,step - 1) +  dfs(grid,x + 1,y,step - 1) +  dfs(grid,x,y - 1,step - 1) +  dfs(grid, x, y + 1, step - 1);
        grid[x][y] = 0;
        return sum;
    }
public:
    int uniquePathsIII(vector<vector<int>>& grid) {
     
        int step = 1,s,e;//全部走完的步骤数,开始端点(s,e)
        for(int i = 0;i < grid.size();++i){
     
            for(int j = 0;j < grid[0].size();++j){
     
                if(grid[i][j] == 1)
                    s = i,e = j;
                else if(grid[i][j] == 0)
                    ++step;
            }
        }
        return dfs(grid,s,e,step);
    }
};

leetcode 980. 不同路径 III(图解)_第4张图片

你可能感兴趣的:(leetcode练习,dfs)