前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >不同路径

不同路径

作者头像
用户7962184
发布于 2020-11-20 06:48:52
发布于 2020-11-20 06:48:52
27700
代码可运行
举报
文章被收录于专栏:没事多喝水没事多喝水
运行总次数:0
代码可运行

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

这个也是动态规划,动态规划有个特点,就是从结果去考虑过程,要找到一个最优的某个路径,或者是找出所有的路径,那么他肯定是经过最接近结果的路径,再从那些路径出发,找到开始的地点,比如在这道题里面。终点是右下角,右下角有多少种走法,就是依赖上方的走法加上左方的走法。然后把这个概念推到全图。得出每个点有多少种走法都是这种方式的。 从而得出,当前走法 = 左走法+上走法的结论。

至于障碍,如果出现了障碍,说明该点的走法为0。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main(){
    fmt.Print(uniquePathsWithObstacles([][]int{
        {0,0,0},
        {0,1,0},
        {0,0,0},
    }))
}


func uniquePathsWithObstacles(obstacleGrid [][]int) int {
    if len(obstacleGrid) <= 0 {
        return 0
    }
    row := len(obstacleGrid)
    col := len(obstacleGrid[0])
    //用来动态规划记录上左状态的,上方状态就是当前的状态,滚动数组原理
    runStatus := make([]int, len(obstacleGrid), len(obstacleGrid))
    if obstacleGrid[0][0] != 1 {
        runStatus[0] = 1
    }
    for j := 0; j < col; j++ {
        for i := 0; i < row; i++ {
            if obstacleGrid[i][j] == 1 {
                runStatus[i] = 0
                continue
            }
            if i > 0 && obstacleGrid[i-1][j] == 0 {
                runStatus[i] += runStatus[i-1]
            }
        }
    }
    return runStatus[len(runStatus)-1]
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验