力扣-不同路径2

发布时间 2023-09-12 20:36:37作者: 摆烂卧底

1.问题描述

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

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

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

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

示例 1:

输入:

[

  [0,0,0],

  [0,1,0],

  [0,0,0]

]

输出: 2

解释:

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

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

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

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

2.说明

m 和 n 的值均不超过 100。

输入说明:

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

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

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

输出说明:

输出一个整数

3.范例

输入范例:

3 3
000
010
000

输出范例:

2

4.思路

跟“不同路径1”的思路差不多,但本题存在了障碍物,只要在障碍物的dp数组中,其值为0,即可。

其中dp [i] [j] 表示在此位置时,有多少路径,当(x, y)处有障碍物时,则dp[x] [y]=0.

初始化dp数组时,第一行和第二行的 dp[i] [0]和 dp[0] [i]代表的是其到达该位置时有多少条路径,因为是第一行和第一列,因此到达[i] [j]的路径均只有1条,因此初始化时:

dp[i][0]=1;

dp[0][i]=1;

同时注意第一行和第一列存在障碍物时,则到达障碍物之后的位置,是没有路径到达的,因为机器人只能向下或向右移动!!!

注意:输入数组时,没有以空格来隔开0和1,因此输入的是字符串/字符,不是整型!!!

5.代码

#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
class Solution
{
public:

    int findpath(vector<vector<char> > &nums)
    {
        int m=nums.size();
        int n=nums[0].size();
        vector<vector<int>> dp(m,vector<int> (n,0));
        for(int i=0;i<m&&nums[i][0]=='0';i++) dp[i][0]=1;
        for(int j=0;j<n&&nums[0][j]=='0';j++) dp[0][j]=1;
        for(int i=1;i<m;i++)
        {
            for(int j=1;j<n;j++)
            {
                if(nums[i][j]=='1')
                    continue;
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
        }
};
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int m,n;
    cin>>m>>n;
    char data;
    vector<vector<char>> nums;
    for(int i=0;i<m;i++)
    {
        vector<char> row;
        for(int j=0;j<n;j++)
        {
            cin>>data;
            row.push_back(data);
        }
        nums.push_back(row);
    }

    int res=Solution().findpath(nums);
    cout<<res<<endl;
    return 0;
}