leetcode——机器人的运动范围

159 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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) > k
  • i >= m
  • j >= n
  • arr[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);
};