持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
前言
力扣练习第8天,拒绝思路老化。今天要练习的是:机器人的运动范围
题目信息如下:
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
/**
* @param {number} m
* @param {number} n
* @param {number} k
* @return {number}
*/
/**
* 输入: m = 2, n = 3, k = 1
* return 3
*/
解法
这道题,其实我的思路刚上来就是深度遍历。就简单讲一下思路吧:
首先,根据题意,我们需要一个函数来帮助我们计算当前位置的和是多少。于是乎,我引入了sum函数:
// sum函数主要计算,当前格子的x,y每位数相加之和。
function sum(m, n){
m = (m + '').split('').reduce((a, b) => a * 1 + b * 1);
n = (n + '').split('').reduce((a, b) => a * 1 + b * 1);
return m * 1 + n * 1;
}
有了sum函数,我们接着往下分析,我们从两条路计算机器人的路径,往右和往下同时进行,为了避免重复,对已走过的进行标记。所以就有这样的截止条件(对当前格子下标记为i, j):
sum(i, j) > ki >= mj >= narr[i][j] === true
完整代码如下:
var movingCount = function(m, n, k) {
function sum(m, n){
m = (m + '').split('').reduce((a, b) => a * 1 + b * 1);
n = (n + '').split('').reduce((a, b) => a * 1 + b * 1);
return m * 1 + n * 1;
};
let arr = Array(m).fill(0).map(() => Array(n).fill(false));
function dfs(i, j){
if(sum(i, j) > k || i >= m || j >= n || arr[i][j]) return 0;
arr[i][j] = true;
return 1 + dfs(i+1, j) + dfs(i, j+1);
};
return dfs(0, 0);
};