承接 不同路徑 i 和 不同路徑 ii,雖然我的解法沒用到動態規劃,但是還是忍不住一塊說了吧。
力扣leetcode-cn.com
題目描述:
在二維網格示例 1:grid
上,有 4 種型別的方格:返回在四個方向(上、下、左、右)上行走時,從起始方格到結束方格的不同路徑的數目,每乙個無障礙方格都要通過一次。
輸入:[[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 ...