当前位置: 首页 > news >正文

算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数进阶版(添加路障)

dp基础问题: 寻找2D矩阵中到达某一坐标的可能路径总数(含路障)

问题描述:

问题和上一篇博文类似,不过这次加上一个设定:有一些坐标为路障,不让通行。

分析:

加上路障之后,大致的解题思路是一样的,但是有一些条件需要被考虑到我们求解的过程中:

  1. 如果起始坐标就是路障,则问题无解
  2. 如果在行进过程中遇到路障,则 numWays[i][j] 的值设为一个不存在的值,因为坐标(i,j)无法到达。
  3. 如果最顶或者最左的坐标遇到一个路障,则路障之后的所有坐标都无法到达。

考虑到这些条件,此问题的算法如下:

算法:
/**
 * 
 * @param {int} x 
 * @param {int} y 
 */
var twodimensional = function(x, y) {
  // construc numWays dp 2-dimensional-matrix
  var numWays = new Array()
  for (let i = 0; i < y; i++) {
    a[i] = new Array()
    for (let j = 0; j < x; j++) {
      a[i][j] = 0
    }
  }
  // set 5 blocked position
  for(let i = 0; i < 5; i++) {
  	a[Math.floor((Math.random()*x)+1)][Math.floor((Math.random()*x)+1)] = -1;
  }
    
  // no way
  if (a[0][0] = -1) {
      console.log('0')
      return 0
  }

  // construct topmost ways
  for (let i = 1; i < x; i++) {
    if (a[0][i] === 0) {
        numWays[0][i] = 1
    } else {
        break;
    }
  }

  // construct leftmost ways
  for (let i = 1; i < y; i++) {
      if (a[i][0] === 0) {
          numWays[i][0] = 1
      } else {
          break
      }
  }

  // find all ways
  for (let i = 1; i < x; i++) {
    for (let j = 1; j < y; j++ ) {
      if (a[i][j] === -1) continue
      if (a[i - 1][j] != -1) {
          numWays[i][j] = numWays[i - 1][j] + numWays[i][j]
      }
      if (a[i][j - 1] != -1) {
          numWays[i][j] = numWays[i][j - 1] + numWays[i][j]
      }
    }
  }
  return numWays[x - 1][y - 1] >= 0 ? numWays[x - 1][y - 1] : 0
}

相关文章:

  • 算法: 动态规划,二维矩阵代价最值进阶版 两条行进路径,一次相交,求解最大代价
  • Programming Languages And Lambda calculi 1.1 定义集合
  • 算法: 动态规划 编辑距离 Edit Distance / Levenshtein Distance
  • 【Salesforce】【Apex】Trigger中不通过soql查询记录类型的开发名称
  • 【Programming Languages And Lambda calculi】 1.2 ~ 1.3 关系、赋值与关系
  • 【Programming Languages And Lambda calculi】 1.4 有向赋值
  • 【算法】 动态规划 基础题库 1-7 python实现
  • 【Programming Languages And Lambda calculi】 1.5 ~ 1.7 上下文规约 赋值函数 符号摘要
  • 【Programming Languages And Lambda calculi】第二章 结构归纳法 2.1 基础
  • 【Programming Languages And Lambda calculi】2.2 ~ 2.3 定义中的省略,证明树中的归纳
  • 【Programming Languages And Lambda calculi】2.4 ~ 2.5 多重结构,更多的定义与证明 第二章结束
  • 【Programming Languages And Lambda calculi】第三章 求值一致性 Church-Rosser 关系 (本章仅一节)
  • 【Programming Languages And Lambda calculi】第四章 Lambda演算 / Lambda表达式 4.1 演算中的函数 柯里化
  • 【Programming Languages And Lambda calculi】4.2 Lambda演算的语法与约化
  • 【Programming Languages And Lambda calculi】4.3 Lambda 表达式中给布尔值编码
  • 「译」Node.js Streams 基础
  • 【347天】每日项目总结系列085(2018.01.18)
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Apache的基本使用
  • Druid 在有赞的实践
  • Hibernate最全面试题
  • IDEA 插件开发入门教程
  • JavaScript设计模式系列一:工厂模式
  • Java新版本的开发已正式进入轨道,版本号18.3
  • laravel 用artisan创建自己的模板
  • MQ框架的比较
  • springMvc学习笔记(2)
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 码农张的Bug人生 - 初来乍到
  • 区块链分支循环
  • 设计模式走一遍---观察者模式
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 通过几道题目学习二叉搜索树
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一个SAP顾问在美国的这些年
  • 原生JS动态加载JS、CSS文件及代码脚本
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​Python 3 新特性:类型注解
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C语言)字符分类函数
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)socket Aio demo
  • (轉貼) UML中文FAQ (OO) (UML)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .sys文件乱码_python vscode输出乱码
  • @RequestMapping 的作用是什么?
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)