您的位置:首页 > 其它

115不同的路径II

2018-01-05 16:44 330 查看
"不同的路径" 的跟进问题:

现在考虑网格中有障碍物,那样将会有多少条不同的路径?

网格中的障碍和空位置分别用 1 和 0 来表示。

//对问题说明:

它没有说完,只能向下或者向左的移动,不然答案不会是这个。

我的思路:

根据110习题学习,我在这道题上采用动态规划的方式,从小到大的构造。

状态转化:f(m,n) = f(m-1,n)  + f(m,n-1);//其中如果f(m,n)是障碍则不更新,f(m-1,n)为障碍则忽略。

初值:最上一行与最左一列MAP初值为1,如果是障碍则跳出赋值,不再继续对同行或列赋值。

最后返回f(m,n)

int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid) {

        // write your code here

        vector<vector<int> >map( obstacleGrid.size(),vector<int>(obstacleGrid[0].size()));

        int l = obstacleGrid.size();

        int w = obstacleGrid[0].size();

        if(l == 1){

            for(int i = 0 ; i < w ; i ++){

                if(obstacleGrid[0][i] == 1)

                    return 0;

            }

            return 1;

        }

        else if(w == 1){

            for(int i = 0 ; i < l ; i ++){

                if(obstacleGrid[i][0] == 1)

                    return 0;

            }

            return 1;

        }

        for(int i = 0 ; i < l ; i ++){

            if(obstacleGrid[i][0] == 1)

                break;

            map[i][0] = 1;

        }

        for(int i = 0 ; i < w ; i ++){

            if(obstacleGrid[0][i] == 1)

                break;

            map[0][i] = 1;

        }

        for(int i = 1 ; i < l ; i ++){

            for(int j = 1 ; j < w ; j ++){

                if(obstacleGrid[i][j] == 1)

                    continue;

                if(obstacleGrid[i-1][j] == 1 && obstacleGrid[i][j-1] == 1){

                    continue;

                }

                else if(obstacleGrid[i-1][j] == 1)

                    map[i][j] = map[i][j-1];

                else if(obstacleGrid[i][j-1] == 1)

                    map[i][j] = map[i-1][j];

                else

                    map[i][j] = map[i-1][j] + map[i][j-1];

            }

        }

        return map[l-1][w-1];

    }

答案:

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