83 不同路径 II
1.问题描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
说明:m 和 n 的值均不超过 100。
示例 1:
输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
-
向右 -> 向右 -> 向下 -> 向下
-
向下 -> 向下 -> 向右 -> 向右
2.输入说明
首先输入矩阵的行数m和列数n
然后输入m行,每行n个字符0或1。中间无空格分隔。
说明:m 和 n 的值均不超过 100。
3.输出说明
输出一个整数
4.范例
输入
3 3
000
010
000
输出
2
5.代码
#include<iostream>
#include<vector>
#include<unordered_map>
#include<string>
#include<set>
#include<queue>
#include<stack>
#include <algorithm>
#include<unordered_set>
#include<string.h>
using namespace std;
int Nums_search(vector<vector<int> >&nums)
{
int m = nums.size();//行数
int n = nums[0].size();//列数
vector<vector<int> >dp(m, vector<int>(n, 0));//重点,刚开始均初始化为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()
{
int m, n,t;
cin >> m;//行数
cin >> n;//列数
vector<vector<int>>nums;
for (int i = 0; i < m; i++)
{
string tmp ="";//这道题目的输入有坑,必须要以字符串形式一行行读入,然后一个个字符转化为数字
cin >> tmp;
vector<int>h;
for (int j = 0; j < tmp.size(); j++)
{
int s = tmp[j]-'0';
h.push_back(s);
}
nums.push_back(h);
}
int res = Nums_search(nums);
cout << res << endl;
return 0;
}
总结!!
1.题目一直AC不了,一看是输入的0和1之间没有空格,因此读取时只能一行行以字符串形式读入,再转化为数字
2.注意单行单列的判断