一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

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

说明:m和n的值不超过100。

示例1:

输入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

解法一: 动态规划

思想算法:

  1. 如果第一个格子点是obstacleGrid[0][0] 是 1, 说明有障碍物,那么机器人就不能做任何的移动,我们就直接返回0;
  2. 否则如果obstacleGrid[0][0] 是 0, 我们初始化这个值为1,然后继续算法;
  3. 遍历第一行,如果有个格子是为1,说明当前节点有障碍物,没有路径可走,设置为0;否则设这个值是前一个节点的值,如下:

    let verticalValue = (obstacleGrid[0][i] == 0 && dp[0][i - 1] == 1) ? 1 : 0

    dp[0].append(verticalValue)

  4. 遍历第一列,如果有一个格子初始值是1, 说明当前节点为障碍物,没有路径可以通过, 设置为0; 否则这个值为前一个节点的值
    (dp[i-1][0]) == 0 || (obstacleGrid[i][0] == 1)判断为0或者1,加入进去
  5. 现在从obstacleGrid[1][1]开始遍历整个数组,如果某个个字初始化不包含任何障碍物,就把值赋予上方和左侧两个格子方案之和
    let value = dp[i - 1][j] + dp[i][j - 1]
    dp[i].append(value)
    不包含障碍物上面.
  6.  如果这个点是障碍物设置为0, 保证对后面的路径不产生贡献.
 
代码如下
func uniquePathsWithObstacles(_ obstacleGrid: [[Int]]) -> Int {
guard obstacleGrid.count > else {return -}
let rowLength = obstacleGrid.count //显示多少行
let verticalLength = obstacleGrid[].count //显示多少列
var dp = [[Int]]()
if obstacleGrid[][] == {//1代表有障碍
return
} //初始化第一个元素,也就是dp[0][0]
var rowArr = [Int]()
for i in ..<rowLength {
if i == {
for j in ..<verticalLength {
if j == {
rowArr.append()
}
}
}
}
dp.append(rowArr) //初始化第一列
for i in ..<rowLength {
var vertical = [Int]()
let rowValue = (obstacleGrid[i][] == && dp[i-][] == ) ? :
for j in ..<verticalLength {
if j == {
vertical.append(rowValue)
}
}
dp.append(vertical)
}
//初始化第一行
for i in ..<verticalLength {
let verticalValue = (obstacleGrid[][i] == && dp[][i - ] == ) ? :
dp[].append(verticalValue)
}
//初始化其它元素
for i in ..<rowLength {
for j in ..<verticalLength {
if obstacleGrid[i][j] == {
let value = dp[i - ][j] + dp[i][j - ]
dp[i].append(value)
} else {
dp[i].append()
}
}
}
return dp[rowLength-][verticalLength-]
}

上面运行代码如下:

上面就是不同路径关于动态规划下,swift完整代码,可以直接运行出来,代码也有注释,以后有新的解法,会持续更新,希望对大家有所帮助!!!

 
 

不同路径II --动态规划的更多相关文章

  1. [LeetCode] 63. 不同路径 II ☆☆☆(动态规划)

    描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在 ...

  2. Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II)

    Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II) 初级题目:Leetcode之动态规划(DP)专题-62. 不同路径(Unique Paths) 一个机 ...

  3. lintcode-115-不同的路径 II

    115-不同的路径 II "不同的路径" 的跟进问题: 现在考虑网格中有障碍物,那样将会有多少条不同的路径? 网格中的障碍和空位置分别用 1 和 0 来表示. 注意事项 m 和 n ...

  4. LeetCode:不同路径&不同路径II

    不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问 ...

  5. 【BZOJ2306】幸福路径(动态规划,倍增)

    [BZOJ2306]幸福路径(动态规划,倍增) 题面 BZOJ 题解 不要求确切的值,只需要逼近 显然可以通过移动\(\infty\)步来达到逼近的效果 考虑每次的一步怎么移动 设\(f[i][j]\ ...

  6. Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)

    Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划) 题目描述 已知一个正方形二维数组A,我们想找到一条最小下降路径的和 所谓下降路径是指,从一行到 ...

  7. lintcode_115_不同的路径 II

    不同的路径 II   描述 笔记 数据 评测 "不同的路径" 的跟进问题: 现在考虑网格中有障碍物,那样将会有多少条不同的路径? 网格中的障碍和空位置分别用 1 和 0 来表示. ...

  8. LintCode_114 不同的路径,115 不同的路径 II

    题目 有一个机器人的位于一个M×N个网格左上角(下图中标记为'Start'). 机器人每一时刻只能向下或者向右移动一步.机器人试图达到网格的右下角(下图中标记为'Finish'). 问有多少条不同的路 ...

  9. Java实现 LeetCode 63 不同路径 II(二)

    63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...

随机推荐

  1. CTF-代码审计(2)

    1.bugku 备份是个好习惯 网址:http://123.206.87.240:8002/web16/ 进去什么都没有,题目说备份想到备份文件,所以直接再后面加个    .bak 拿到源码: < ...

  2. 使用tcpdump监控http流量

    使用tcpdump监控http流量,具体内容包括:http request,http response,http headers以及http message body. 监控本机http流量 tcpd ...

  3. centos7.2下安装python3.6.5

    yum groupinstall 'Development Tools' 出现错误 系统 centos 7.3 使用命令 yum groupinstall 'Development Tools' 出现 ...

  4. Nginx 反向代理功能-实现Nginx tcp负载均衡

    Nginx 反向代理功能-实现Nginx tcp负载均衡 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  5. 网络编程socket理论一

    网络通信理论 首先说下网络之间的通信流程看图 Socket 层是位于运输层和应用层之间的,封装好的,方便使用 Socket 是什么和工作流程 Socket是应用层与TCP/IP协议族通信的中间软件抽象 ...

  6. mysql的基本数据类型里几个int如下:TINYINT SMALLINT  MEDIUMINT  INT或INTEGER   BIGINT

    mysql的基本数据类型里几个int如下:类型           大小 范围(有符号) 范围(无符号) 用途 TINYINT  1字节   (-128,127)    (0,255) 小整数值 SM ...

  7. 安装Vyos

      Vyos是一个开源的网络操作系统,基于Debian,相对于ROS需要购买license,Vyos就更加开放的多. 下载Vyos wget http://vyos.hecint.com/iso/re ...

  8. Layui 表单赋值 编辑页面赋初值

    原文:https://blog.csdn.net/yulongxue/article/details/97924591 //编辑 if (id > 0) { $.post("/Hand ...

  9. C语言实现FTP服务器

    公共部分代码 /* common.h */ #ifndef COMMON_H #define COMMON_H #include <arpa/inet.h> #include <ct ...

  10. 第02组 Alpha冲刺(2/6)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 任务分配.进度监督 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的进度 还剩下哪些任务 ...