标签:
Unique Paths II
这次还是机器人在最左上角,想要到达最右下角,机器人能走的方向还是向下和向右,但是与上次不同的是:路上有障碍物,有障碍物的地方不能通过,找出所有独一无二的路径。
上个题的解题思路我自己好像也没什么算法根据,凭借的是自己观察问题找到的,不过这个题我还是按照那样的想法去做的话,确实没想通,我试了一下,发现代码很复杂而且没有把握,所以我换了种思路,我借鉴了一下网友的,主要是为了弄明白这个题属于哪一类问题,它是动态规划类的问题!
首先,我们可以得出这样一个结论:机器人当前所在的位置(i,j)其实是由(i,j-1)或者(i-1,j)位置得到的,所以我们可以得出:
nums(i , j) = nums(i , j-1) + nums(i-1 , j)
这点推导出来了,解题就简单多了,所以我们就可以很方便的解题了,不过需要注意的一点就是,当 (i , j) 位置为障碍物时,它的路径数目为0。
下面就给出代码吧,想清楚思路后真的是很容易就可以解决问题。
class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { if (obstacleGrid.size() == 0 || obstacleGrid[0].size() == 0) { return 0; } //采用动态规划解题 int xLen = obstacleGrid.size(); int yLen = obstacleGrid[0].size(); //开辟额外的空间,因为每个位置都是由它上方或者左方过来的,所以(i,j)位置的路径=nums(i,j-1)+nums(i-1,j) //多开辟出来的空间其实是辅助作用 vector<vector<int>> V(xLen + 1, vector<int>(yLen + 1, 0)); V[0][1] = 1; // 其实将v[1][0]置为1效果一样,因为他们都是辅助空间 for (int i = 1; i <= xLen; ++i) { for (int j = 1; j <= yLen; ++j) { if (obstacleGrid[i-1][j-1] == 0) V[i][j] = V[i][j - 1] + V[i - 1][j]; //nums(i,j) = nums(i,j-1) + nums(i-1,j) else V[i][j] = 0; //但是考虑到存在障碍物,障碍物对应位置的路径数目为 0 } } return V[xLen][yLen]; } };程序的结果如下:
标签:
原文地址:http://blog.csdn.net/zr1076311296/article/details/51622275