不同路径III算法 | 青训营笔记

154 阅读2分钟

这是我参与第四届青训营笔记创作活动的第25天

(本文在此声明,此文为本作者另一个账号所写,参与青训营后发现发现青训营手机号填的不是那个,特此将笔记转载过来)

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

1 表示起始方格。且只有一个起始方格。

2 表示结束方格,且只有一个结束方格。

0 表示我们可以走过的空方格。

-1 表示我们无法跨越的障碍。 返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目。

每一个无障碍方格都要通过一次,但是一条路径中不能重复通过同一个方格。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/un…

示例1:

输入: [[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
输出: 2

image.png

题目的简单意思:从1开始,到2结束,经过所有的0,所有的-1不经过,所有路径只能经过一次。 解题思路:回溯

1.首先找到起点的位置,获取需要移动的步数。 2.从起点开始,每一步走过之后,设值为-1,分别递归,向左、向右、向上、向下的情况

var uniquePathsIII = function (grid) {
    let res = 0
    let l = grid.length
    let r = grid[0].length
    // 计算0的个数count,获取起点位置grid[m,n]
    let count = 0
    let m, n
    for (let i = 0; i < grid.length; i++) {
        for (let j = 0; j < grid[i].length; j++) {
            if (grid[i][j] == 0) {
                count++
            }
            if (grid[i][j] == 1) {
                m = i
                n = j
            }
        }
    }
    function dfs(m, n, index) {
    //递归终止条件判断。当m,n超出矩形边界时,当前矩形位置为-1时,当前值为-2但是步数没有达到要求时,均终止递归
        if (m >= l || n >= r || m < 0 || n < 0 || grid[m][n] == -1) {
            return
        } else
            if (grid[m][n] == 2) {
            //当前位置值为-2,并且步数达到要求(等于0的个数+1的个数+2的个数)
                if (index == count + 2) {
                    res++
                    return
                } else {
                    return
                }
            }
        //走过的路,设置值为-1,防止重复走
        grid[m][n] = -1
        
        //递归
        dfs(m, n + 1, index + 1)
        dfs(m + 1, n, index + 1)
        dfs(m - 1, n, index + 1)
        dfs(m, n - 1, index + 1)
        
        //回溯,将状态设置为递归前状态
        grid[m][n] = 0
    }

    dfs(m, n, 1)
    return res
};