《剑指offer》机器人的运动范围

题目描述:

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

示例1
输入

5,10,10

返回值

21

1、递归的方式实现

/**
 * 1、核心思路是机器人从(0,0)坐标开始走,走成功一步就标记为true, 递归当前位置上下左右的点, 返回 1 + 4个方向的值
 * 2、递归时判断当前位置可达的标准
 * 1)当前位置在矩阵内 r < 0 || r >= rows || c < 0 || c >= cols
 * 2)当前位置未被访问过 dp[r][c]
 * 3)当前位置坐标的数位之和大于limit
 */
function movingCount(threshold, rows, cols) {
    // write code here
    // 创建一个二维数组
    let dp = Array.from({
        length: rows
    }, x => Array.from({
        length: cols
    }, y => 0));
    return countAll(threshold, rows, cols, 0, 0, dp)
}
// 计算
function countAll(limit, rows, cols, r, c, dp) {
    if (r < 0 || r >= rows || c < 0 || c >= cols || dp[r][c] || stepNum(r + '' + c) > limit) return 0;
    dp[r][c] = true
    // console.log(dp, "DP")
    return countAll(limit, rows, cols, r - 1, c, dp) +
        countAll(limit, rows, cols, r, c - 1, dp) +
        countAll(limit, rows, cols, r + 1, c, dp) +
        countAll(limit, rows, cols, r, c + 1, dp) + 1;
}
// 计算该位置坐标的数位之和
function stepNum(str) {
    return str.split('').reduce(function (prev, curr, idx, arr) {
        return parseInt(prev) + parseInt(curr);
    });
}

推荐阅读更多精彩内容

  • 二维数组中的查找 Q: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按...
    菜鸡不得行阅读 1,796评论 0 2
  • 1.二维数组的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从...
    linjiason阅读 249评论 0 0
  • 题目:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格...
    qming_c阅读 347评论 0 0
  • 剑指Offer笔试题(4) 题目来源:牛客网 题目一 扑克牌顺子 描述: LL今天心情特别好,因为他去买了一副扑...
    Torang阅读 1,075评论 0 4
  • 题目五十一 请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为...
    MichealXXX阅读 36评论 0 0