(動態規划)機器人走迷宮問題


  • 題目一:https://www.nowcoder.com/practice/166eaff8439d4cd898e3ba933fbc6358?tpId=46&tqId=29117&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking

  • 題目翻譯:
    機器人位於m x n網格的左上角(在下圖中標記為“開始”)。
    
    機器人只能在任何時間點向下或向右移動。 機器人試圖到達網格的右下角(在下圖中標記為“完成”)。
    
    有多少個可能的唯一路徑?
    
    上面是一個3×7的網格。 有多少個可能的唯一路徑?
    
    注意:m和n最多為100。

     

  • 思路:這道題目是一道典型的動態規划問題。從多個小問題的解的合並能夠解決最終原問題的解。得出的遞推式:res[i][j] = res[i-1][j] + res[i][j-1];  初始化的時候將res二維數組的第一行第一列都置為1,方便計算。
  • 代碼:
    class Solution {
    public:
        int uniquePaths(int m, int n) {
           vector<vector<int>> res(m, vector<int>(n, 1));// 初始化二維數組  
           for (int i = 1; i<m ; i++)
               for (int j = 1; j<n; j++){
               res[i][j] = res[i-1][j] + res[i][j-1];
           }
            return res[m-1][n-1];
        }
    };

     

  • 題目二:https://www.nowcoder.com/practice/3cdf08dd4e974260921b712f0a5c8752?tpId=46&tqId=29116&tPage=4&rp=4&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
  • 題目翻譯:
    唯一路徑”的后續跟蹤:
    
    現在考慮如果一些障礙物添加到網格。 有多少獨特的路徑會有?
    
    障礙物和空白區域在網格中分別標記為1和0。
    
    例如,
    
    在3x3網格的中間有一個障礙物,如下所示。
    
    [
       [0,0,0],
       [0,1,0],
       [0,0,0]
    ]]
    
    唯一路徑的總數為2。
    
    注意:m和n最多為100。

     

  • 思路:這道題其實是上面那個題目的衍生,方法肯定還是dp,但是要對出現障礙物的位置進行特殊處理。試想當只有一行的時候,某個障礙物出現,那么到達路徑為0.只有一列的時候也是一樣。所以首先初始化的時候對第一行第一列上面出現障礙物的地方將path[i][0]  和path[0][i]都置為0.然后我們還是利用上面的遞推式進行計算:res[i][j] = res[i-1][j] + res[i][j-1]。循環計算的時候如果碰到障礙物,就將path[i][j]置為0.這樣就解決了這個問題。
  • 代碼:
    class Solution {
    public:
        int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
            int row = obstacleGrid.size();
            int col = obstacleGrid[0].size();
            
            vector<vector<int> > res(row, vector<int>(col, 0));
            for (int i=0; i<col; i++){//處理列
                res[0][i] = 1;
                if (obstacleGrid[0][i] == 1){
                    res[0][i] = 0;
                    break;
                } 
            }
            for (int i=0; i<row; i++){//處理列
                res[i][0] = 1;
                if (obstacleGrid[i][0] == 1){
                    res[i][0] = 0;
                    break;
                } 
            }
            
            for (int i=1; i<row; i++){
                for (int j=1; j<col; j++){
                    res[i][j] = res[i-1][j] + res[i][j-1];
                    if (obstacleGrid[i][j] == 1)
                        res[i][j] = 0;
                }
            }
            return res[row-1][col-1];
        }
    };

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM