83 不同路径 II(63)

作者: Turbo时间限制: 1S章节: 动态规划

晚于: 2020-09-02 12:00:00后提交分数乘系数50%

截止日期: 2020-09-09 12:00:00

问题描述 :

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

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

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

说明:m 和 n 的值均不超过 100。

示例 1:

输入:

[

  [0,0,0],

  [0,1,0],

  [0,0,0]

]

输出: 2

解释:

3x3 网格的正中间有一个障碍物。

从左上角到右下角一共有 2 条不同的路径:

1. 向右 -> 向右 -> 向下 -> 向下

2. 向下 -> 向下 -> 向右 -> 向右

输入说明 :

首先输入矩阵的行数m和列数n

然后输入m行,每行n个字符0或1。中间无空格分隔。

说明:m 和 n 的值均不超过 100。

输出说明 :

输出一个整数

输入范例 :

输出范例 :

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) 
    {
        int m=obstacleGrid.size(),n=obstacleGrid[0].size();
        vector<vector<int>> dp(m,vector<int>(n,0));
        if(m==0||n==0)
        {
            return 0;
        }
       
        if(obstacleGrid[0][0]==1)
            return 0;
        else
            dp[0][0]=1;
        for(int i=1;i<m;i++)
        {
            if(obstacleGrid[i][0]==0)
            {
                dp[i][0]=dp[i-1][0];
            }
        
        } 
        for(int j=1;j<n;j++)
        {
            if(obstacleGrid[0][j]==0)
                dp[0][j]=dp[0][j-1];
        }
        for(int i=1;i<m;i++)
        {
            for(int j=1;j<n;j++)
                if(obstacleGrid[i][j]==0)
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
        }

        return dp[m-1][n-1];
    }
};
int main()
{
    int m, n;
    char data;
    vector<vector<int> > obstacleGrid;
    cin>>m>>n;
    for(int i=0; i<m; i++)
    {
        vector<int> row;
        for(int j=0; j<n; j++)
        {
            cin>>data;
            row.push_back(data-'0');
        }
        obstacleGrid.push_back(row);
    }
    int res=Solution().uniquePathsWithObstacles(obstacleGrid);
    cout<<res<<endl;
    return 0;
}

 

原文地址:https://www.cnblogs.com/zmmm/p/13654826.html