LeetCode OJ--Unique Paths II **

https://oj.leetcode.com/problems/unique-paths-ii/

图的深搜,有障碍物,有的路径不通。

刚开始想的时候用组合数算,但是公式没有推导出来。

于是用了深搜,递归调用。

但是图最大是100*100,太大了,超时。考虑到在计算(2,1)和(1,2)都用到了(2,2),也就是说有了重复计算。于是记录这些中间的数据。

而有的地方因为有障碍物,所以得的路径值是0,这又要和没有计算做个区分,于是又加了些数据,标志是否已经计算过了。

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
        if(obstacleGrid.size() == 0)
            return 0;

        int row = obstacleGrid.size();
        int col = obstacleGrid[0].size();
        //the destination position unavailable
        if(obstacleGrid[row-1][col-1] == 1 || obstacleGrid[0][0] ==1)
            return 0;
        vector<vector<bool> > handled; //to mark if xy has handled
        vector<vector<int> > tempRecord;
        handled.resize(row);
        tempRecord.resize(row);
        for(int i = 0;i<row;i++)
        {
            tempRecord[i].resize(col);
            handled[i].resize(col);
            for(int j = 0;j<col;j++)
                handled[i][j] = false; // all initialized false
        }

        int ans = calcPath(obstacleGrid,0,0,row,col,tempRecord,handled);
        
        //no path
        if(ans < 0 )
            ans = 0;
        return ans;
    }

    int calcPath(vector<vector<int> > &grid ,int xPos, int yPos,int row,int col,vector<vector<int> > &tempRecord,vector<vector<bool> > &handled)
    {
        //destination
        if(xPos == row -1 && yPos == col -1 )
            return 1;
        //unhandle this position
        if(tempRecord[xPos][yPos] == 0 && handled[xPos][yPos] == false)
        {
            int ans = 0;
            if(xPos < row-1 && grid[xPos + 1][yPos] ==0)
                if(handled[xPos+1][yPos] == false)
                    ans = calcPath(grid,xPos+1,yPos,row,col,tempRecord,handled);
                else
                    ans = tempRecord[xPos+1][yPos];
             
            if(yPos < col -1 && grid[xPos][yPos+1] == 0)
                //unhandled
                if(handled[xPos][yPos+1] == false)
                    ans += calcPath(grid,xPos,yPos+1,row,col,tempRecord,handled);
                else   
                    ans += tempRecord[xPos][yPos+1];

            tempRecord[xPos][yPos] = ans;
        }
        handled[xPos][yPos] = true;
        return tempRecord[xPos][yPos];
    }
};
原文地址:https://www.cnblogs.com/qingcheng/p/3794167.html