题目描述:
地上有一个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);
});
}