题目描述:
地上有一个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
话不多说,直接上代码,后面有分析注释
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>机器人的运动范围</title>
</head>
<body>
</body>
<script>
/**
* @param {number} m
* @param {number} n
* @param {number} k
* @return {number}
*/
var movingCount = function(m, n, k) {
if( k == 0){
return 1
}
let result = 0
//创建访问数组
var visited = new Array();
for(var i=0;i<m;i++){
visited[i]=new Array();
for(var j=0;j<n;j++){
visited[i][j]="";
}
}
//判断当前方格的坐标和
var all =(m,n)=>{
let total = 0
m = m.toString().split("")
n = n.toString().split("")
for (i=0;i<m.length;i++){
total += Number(m[i])
}
for(i=0;i<n.length;i++){
total += Number(n[i])
}
return total
}
var dfs =(i,j,k)=>{
if( i>= m || j>=n || i<0 || j<0 ){ //越界
return ;
}
if( all(i,j)> k ){ //不满足条件
return ;
}
//此时,格子各位数加起来小于k,判断该格子是否走过
if( visited[i][j] != 0 ){ //若不为0,则表明已经走过,则不计算该格子,直接返回
return ;
}
visited[i][j] =1 //格子未走过,置为1,且可走的格子数+1
result += 1
//向上下左右遍历
dfs(i-1,j,k)
dfs(i,j-1,k)
dfs(i+1,j,k)
dfs(i,j+1,k)
}
dfs(0,0,k) //注意:此时不能双层循环,否则会遍历所有格子,而不是计算能达到的格子
console.log(visited)
console.log(result)
return result
};
movingCount(16,8,4) //15
</script>
</html>