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;
};