[路飞]_js算法:leetcode 剑指 Offer 13-机器人的运动范围

92 阅读1分钟

leetcode 剑指 Offer 13. 机器人的运动范围

问题描述: 地上有一个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。请问该机器人能够到达多少个格子?

示例 1:

输入: m = 2, n = 3, k = 1
输出: 3

示例 2:

输入: m = 3, n = 1, k = 0
输出: 1

提示:

  • 1 <= n,m <= 100
  • 0 <= k <= 20 思路: 广度优先遍历 用哈希表记录是否走过
/**
 * @param {number} m
 * @param {number} n
 * @param {number} k
 * @return {number}
 */
 function Data(i,j,k){
     this.i=i||0;
     this.j=j||0;
 }
 let dum=new Array(100).fill(0);
 for(let i=0;i<10;i++){
     for(let j=0;j<10;j++){
         dum[i*10+j]=i+j//获取下标和
     }
 }
var movingCount = function(m, n, k) {
    let map=new Map();
    let ans=0;
    let queue=[];
    queue.push(new Data(0,0))
    map.set(0);
    let vec=[[0,1],[0,-1],[-1,0],[1,0]]
    while(queue.length){
        let cur=queue[0];
        ans+=1;//队列中值处理依次说明该点可以走
        for(let i=0;i<4;i++){
            let x=cur.i+vec[i][0];
            let y=cur.j+vec[i][1];
            if(x<0||x>=m)continue;
            if(y<0||y>=n)continue;
            if(dum[x]+dum[y]>k)continue;
            if(map.has(x*n+y))continue;
            map.set(x*n+y);
            queue.push(new Data(x,y))
        }
        queue.shift()
    }
return ans;
};