您的位置:首页 > 其它

百度2015 在线笔试题(2)

2015-09-17 09:12 309 查看

题目

障碍物问题,类似LeetCode45题Jump Game II

不同的是,此处约定从左下角走至右上角,每一步只能向右、向上或斜上方前进,另外所给矩阵中元素1代表无障碍,元素0代表有障碍;

分析

动态规划,与LeetCode45题Jump Game II采用相同的处理,注意 (i , j)的取值即可!

程序

#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

//直接用非递归算法求解
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> >& obstacleGrid) {

if (obstacleGrid.empty())
return 0;

int m = obstacleGrid.size();
int n = obstacleGrid[0].size();

vector<vector<int> > ret(m, vector<int>(n, 0));

//矩阵最左列
for (int i = m-1; i >= 0; i--)
{
//无障碍,则有一条路径,否则不通
if (obstacleGrid[i][0] == 1)
ret[i][0] = 1;
else
break;
}//for

//矩阵最底行
for (int j = 0; j < n; j++)
{
//无障碍,则有一条路径,否则不通
if (obstacleGrid[m-1][j] == 1)
ret[m-1][j] = 1;
else
break;
}//for

//其余位置
for (int i = m-2; i >= 0; i--)
{
for (int j = 1; j < n; j++)
{
//当前位置为障碍,则到此处路径数为0
if (obstacleGrid[i][j] == 0)
ret[i][j] = 0;
else{
ret[i][j] = ret[i+1][j] + ret[i][j-1] + ret[i+1][j-1];
}//else
}//for
}//for

return ret[0][n - 1];
}//uniques

};

int main()
{
Solution s;

vector<vector<int> > v = { { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 } };
//vector<vector<int> > v = { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } };
cout << s.uniquePathsWithObstacles(v) << endl;

system("pause");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: