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; }
标签:障碍物,nums,int,不同,路径,网格,力扣,dp From: https://www.cnblogs.com/ohye/p/17697770.html