题目:
解析:
本题主要就是考虑这个障碍物,当然障碍物还是很好解决的,就是我们在初始化记录的时候我们每记录一个为一的数,就把这个这个数改为0。
因为这个走法是只能向下或者向右的,所以我是把这个题目分解成两步。
第一步:
先把第一行、第一列的数据考虑一下,并且记录保存。
注意:在找到1后,我们要考虑1后面的数据,它应该变为0,因为它们是无效的数据了。
//第一行
int i;
for ( i = 0; i < n;++i) {
if (obstacleGrid[0][i] == 1) {//在第一行中,只要找到一个1就结束程序
obstacleGrid[0][i] = 0;
break;
}
obstacleGrid[0][i] = 1;
}
while (i < n) { //把找到的1后面的数据都变为0
obstacleGrid[0][i] = 0;
i++;
}
//第一列
int j;
for (j = 1; j < m; ++j) {
if (obstacleGrid[j][0] == 1) {
obstacleGrid[j][0] = 0;
break;
}
obstacleGrid[j][0] = 1;
}
while (j < m) {
obstacleGrid[j][0] = 0;
j++;
}
第二步:
第二步就是同样的思路了,如果在其中发现有个1,那么它这个位置就变为0,但是与上一步不同的是,如果不为0那么就加上上面和左边的数据,这是个选择判断。
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 1)
obstacleGrid[i][j] = 0;
else
obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];
}
}
代码:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
if (obstacleGrid[0][0] == 1) return 0;
int i;
for ( i = 0; i < n;++i) {
if (obstacleGrid[0][i] == 1) {
obstacleGrid[0][i] = 0;
break;
}
obstacleGrid[0][i] = 1;
}
while (i < n) {
obstacleGrid[0][i] = 0;
i++;
}
int j;
for (j = 1; j < m; ++j) {
if (obstacleGrid[j][0] == 1) {
obstacleGrid[j][0] = 0;
break;
}
obstacleGrid[j][0] = 1;
}
while (j < m) {
obstacleGrid[j][0] = 0;
j++;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 1)
obstacleGrid[i][j] = 0;
else
obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];
}
}
return obstacleGrid[m - 1][n - 1];
}
};
代码不是dp的规范化,希望大佬们指点。