• 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;
    }

     

  • 相关阅读:
    常数时间国密算法
    A Guide to the Go Garbage Collector
    并发控制 互斥
    词典遍历顺序
    max size of IPv4 & IPv6 packet 包大小
    BufferOverflow Attacks
    unsigned 是表示无符号数据类型,
    回溯 递归 的回退状态
    抖音平台多产物代码隔离技术的实践与探索
    依赖注入 开发效率
  • 原文地址:https://www.cnblogs.com/zmmm/p/13654826.html
Copyright © 2020-2023  润新知