leetcode No 980 不同路徑 III

2021-09-29 20:39:52 字數 1735 閱讀 1446

承接 不同路徑 i 和 不同路徑 ii,雖然我的解法沒用到動態規劃,但是還是忍不住一塊說了吧。

力扣​leetcode-cn.com

題目描述:

在二維網格grid上,有 4 種型別的方格:

返回在四個方向(上、下、左、右)上行走時,從起始方格到結束方格的不同路徑的數目,每乙個無障礙方格都要通過一次

示例 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
解題思路:

相比於前兩題,這回終於可以向上下左右四個方向自由移動了。

碰到這種二維矩陣走格仔的題,真是忍不住條件反射要用dfs+回溯了。做多了其實寫出來還是不難的,要注意的是需要訪問每個空方格僅一次。我們可以把訪問過的空方格置為 -1 來實現,注意要在遞迴呼叫之後恢復回來。

如果超出矩陣邊界或者是遇到障礙就返回 0,如果到了終點,就看此時還剩不剩未訪問過的空方格,如果沒有說明可以行進的路線又多了一條。

**如下:

class solution 

else if(grid[i][j] == 0)}}

return dfs(grid, r, c, step);

}private:

int dfs(vector>& grid, int r, int c, int step)

};

雖然我們用了回溯法求解本題,但其實本題仍然可以用動態規劃求解的,感興趣的同學可以試試。

不同路徑 II

題目 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?網格中的障礙物和空位置分別用 1 和 0 來表示。輸...

不同路徑 II

乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?網格中的障礙物和空位置分別用 1 和 0 來表示。示例 1...

62 不同路徑63 不同路徑 II

62.不同路徑 動態規劃清晰步驟 1.定義dp陣列 2.初始化 3.迴圈填充 4.返回結果 class solution 4.返回結果 return dp m 1 n 1 動態規劃寫法2 內部解決初始化問題 class solution2 else if i 0 j 0 else if i 0 j ...