【算法】动态规划 ⑥ ( 骑士的最短路径 II | 问题分析 | 代码示例 )
发布时间:2022-12-31 08:52:28 347
相关标签:
文章目录
- 一、问题分析
- 二、代码示例
骑士的最短路径 II :
在 国际象棋 中 , 骑士 类似 与 象棋 中的 马 , 走 " 日 " 字 格子 ;
骑士有 8 种走法 : " 日 " 字 格子 , 参考 百度百科
- 左走一格向前走两格
- 左走一格向后走两格
- 左走两格向前走一格
- 左走两格向后走一格
- 右走一格向前走两格
- 右走一格向后走两格
- 右走两格向前走一格
- 右走两格向后走一格
下图是 骑士 的走法 , 黑色是 骑士的初始位置 ( 0 , 0 ) , 绿色 和 红色 是 骑士 可以走的 下一步位置 ;
给定一个二维坐标 , 在该坐标系中 , 骑士只能走 上图中 右边 红色的四个方向的步骤 , 计算从 左上角 到 右下角 的最短路径数 ;
一、问题分析
如果 骑士 可以走 8 个方向 ,
- 那么需要 使用 BFS 宽度优先搜索 算法 ;
- 此时 不能使用 动态规划解决上述问题 , 如果 可以走 8 个方向 , 那么路径就可以反复 , 会出现 循环依赖的情况 ;
如果 骑士 只能走右边的 4 个方向 , 没有循环依赖 , 则可以使用动态规划 , 解决上述问题 ;
如果 骑士 只能走 右侧的 四个方向 , 也就是
- 从 黑点 走到 红点 1 , 纵坐标方向上 i 减少 2 行 , 横坐标方向上 j 增加 1 列 ;
- 从 黑点 走到 红点 2 , 纵坐标方向上 i 减少 1 行 , 横坐标方向上 j 增加 2 列 ;
- 从 黑点 走到 红点 3 , 纵坐标方向上 i 增加 1 行 , 横坐标方向上 j 增加 2 列 ;
- 从 黑点 走到 红点 4 , 纵坐标方向上 i 增加 2 行 , 横坐标方向上 j 增加 1 列 ;
那么 如果当前位置是 ( i , j ) , 那么当前位置的 最短路径 是 dp[i][j] , 那么该点的 最短路径 依赖于 如下几个点的最短路径 :
- ( i + 2 , j - 1 ) , 对应 从 黑点 走到 红点 1 , 纵坐标方向上 i 减少 2 行 , 横坐标方向上 j 增加 1 列 ;
- ( i + 1 , j - 2 ) , 对应 从 黑点 走到 红点 2 , 纵坐标方向上 i 减少 1 行 , 横坐标方向上 j 增加 2 列 ;
- ( i - 1 , j - 2 ) , 对应 从 黑点 走到 红点 3 , 纵坐标方向上 i 增加 1 行 , 横坐标方向上 j 增加 2 列 ;
- ( i - 2 , j - 1 ) , 对应 从 黑点 走到 红点 4 , 纵坐标方向上 i 增加 2 行 , 横坐标方向上 j 增加 1 列 ;
初始化状态值时 , dp[i][j] 代表了从 起始点 ( 0 , 0 ) 位置 跳转到 ( i , j ) 位置的 最短路径数 ;
该算法求的是 最短路径数 , 初始化 状态 值 时 , 不能初始化为 0 , 这里 初始化为 Integer.MAX_VALUE 值 , 如果值为 Integer.MAX_VALUE 说明该点走不到 ;
如果 算法求的是 方案数 , 则初始化状态值时 , 可以初始化为 0 ;
二、代码示例
代码示例 :
执行结果 :
文章来源: https://blog.51cto.com/u_14202100/5950517
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报