• 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];
        }
    };
  • 相关阅读:
    Java基础知识回顾之一 ----- 基本数据类型
    大数据初学者应该知道的知识
    MyEclipse 快捷键大全
    hibernate简单入门教程(一)---------基本配置
    MyEclipse中文注释乱码解决
    中间件(WAS、WMQ)运维 9个常见难点解析
    Oracle PL/SQL Dev工具(破解版)被植入勒索病毒的安全预警及自查通告
    呼叫中心系统的相关术语
    INFORMATICA 开发规范
    什么是RESTful API
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3794167.html
Copyright © 2020-2023  润新知