/**
* @author Limg
* @date 2022/08/09
* 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
* 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
* 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
* 网格中的障碍物和空位置分别用 1 和 0 来表示。
*/
#include<iostream>
#include<vector>
using namespace std;
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid);
int main()
{
int m=2,n=2;
cin>>m;
cin>>n;
vector<vector<int> > obstacleGrid;
int value;
vector<int> temp;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>value;
temp.push_back(value);
}
obstacleGrid.push_back(temp);
temp.clear();
}
cout<<uniquePathsWithObstacles(obstacleGrid)<<endl;
return 0;
}
//解题函数
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid)
{
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
long record[m][n];
if(obstacleGrid[0][0]==1)
{
record[0][0]=0;
}
else
{
record[0][0]=1;
}
for(int i=1;i<m;i++)
{
if(obstacleGrid[i][0]==1)
{
record[i][0]=0;
}
else
{
record[i][0]=record[i-1][0];
}
}
for(int i=1;i<n;i++)
{
if(obstacleGrid[0][i]==1)
{
record[0][i]=0;
}
else
{
record[0][i]=record[0][i-1]; //这里注意!!要考虑前面有障碍物后面都不通
}
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if(obstacleGrid[i][j]==1)
{
record[i][j]=0;
}
else
{
record[i][j]=record[i-1][j]+record[i][j-1];
}
}
}
return record[m-1][n-1];
}
力扣63.不同路径II(动态规划)
最新推荐文章于 2024-06-11 22:11:50 发布