【LeetCode练习】剑指 Offer 13. 机器人的运动范围(中等|JS|DFS、BFS)

一、题目描述

在这里插入图片描述

二、解题思路

方法1:深度优先搜索,需要用一个二维数组来保存机器人是否进入过某个坐标[row,col],避免重复计算,先向一个方向搜索到底,再回溯到上一个节点,从这个节点开始沿另一个方向搜索。
踩了一个坑:JS用Array.fill()初始化二维数组的方式要注意,查了一下才知道:JS中用Array.fill() 初始化 二维数组
思路主要参考这一篇:DFS和BFS解决机器人的运动范围.

方法2:广度优先搜索。。。(先鸽着,等学会了再来)

三、代码实现

方法1:

var movingCount = function (m, n, k) {
    function cal(i) {
        let sum = 0
        while (i) {
            sum += i % 10
            i = Math.floor(i/10)
        }
        return sum
    }
    function dfs(row, col, visited) {
        if (row >= 0 && row < m && col >= 0 && col < n && !visited[row][col] && cal(row) + cal(col) <= k) {
            visited[row][col] = true
            return (
                1 +
                dfs(row - 1, col, visited) +
                dfs(row + 1, col, visited) +
                dfs(row, col - 1, visited) +
                dfs(row, col + 1, visited)
            )
        }
        return 0
    }
    if (m <= 0 || n <= 0 || k < 0) return 0
    let visited = new Array(m).fill(false).map(() => new Array(n).fill(false))
    // 不能这样初始化二维数组,第二维里面的值会指向同一个地址,改一个全部变
    // let visited = new Array(m).fill(new Array(n).fill(false))
    
    let count = dfs(0,0,visited)
    return count
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值