【6】网格左上角到右下角,每次仅能往下或往右走一步(不同路径问题)

不同路径一(无障碍物)

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?

解法一 直接递归

class Solution {
public:
    int UniquePaths(int m,int n,int p,int q)
{
    if(p==m||q==n)
        return 1;
    return UniquePaths(m,n,p+1,q)+UniquePaths(m,n,p,q+1);
}

    int uniquePaths(int m, int n) {
        return UniquePaths(m,n,1,1);
    }
};

解法二 带备忘录递归

class Solution {
public:

int UniquePaths(int m,int n,int p,int q)
{
    static int square[101][101];
    for(int i=0;i<101;++i)
    for(int j=0;j<101;++j)
    square[i][j]=0;
    if(p==m||q==n)
        return 1;
    if(square[p][q]!=0)
        return square[p][q];
    else {
        square[p][q] = UniquePaths(m, n, p + 1, q) + UniquePaths(m, n, p, q + 1);
        return square[p][q];
    }

}

    int uniquePaths(int m, int n) {
        return UniquePaths(m,n,1,1);
    }
};

解法三:动态规划

static int square[101][101];
class Solution {
public:
    int uniquePaths(int m, int n) {
    for(int i=0;i<m;++i)
        square[i][n-1]=1;
    for(int j=0;j<n;++j)
        square[m-1][j]=1;
    for(int i=2;i<=m;++i) {
        for (int j=2; j <= n; ++j) {
            square[m - i][n - j] = square[m - i + 1][n - j] + square[m - i][n - j + 1];
        }
    }

    return square[0][0];
}  
};

不同路径二,存在障碍物

和上题思路一致,只是在赋初始值时,如果最下面一条边和最右边一条中间出现了障碍物,那么障碍物后面的就无法前往。
如果出现了障碍物,那就将该方格的道路数设为0,再进行下一步运算。

int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
    int m,n;
    n=obstacleGrid.size();
    m=obstacleGrid[0].size();
    if(!n)
        return 0;
    if(obstacleGrid[0][0]||obstacleGrid[n-1][m-1])
        return 0;
    for(int i=m-1;i>=0;--i)
    {
        if(obstacleGrid[n-1][i]!=1)
            square[n-1][i]=1;
        else break;
    }
    for(int j=n-1;j>=0;--j)
    {
        if(obstacleGrid[j][m-1]!=1)
            square[j][m-1]=1;
        else break;
    }
    for (int j=2; j <= n; ++j) {
        for (int i=2; i <= m; ++i) {
            if(obstacleGrid[n-j][m-i]==1)
                square[n-j][m-i]=0;
            else square[n-j][m-i] = square[n-j+1][m-i] + square[n-j][m-i+1];
        }
    }

    return square[0][0];
}

你可能感兴趣的:(【6】网格左上角到右下角,每次仅能往下或往右走一步(不同路径问题))