// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
class Solution {
public int movingCount(int m, int n, int k) {
// 使用临时变量 visited 记录格子是否被访问过
boolean[][] visited = new boolean[m][n];
// 开始深度优先遍历
return dfs(0, 0, m, n, k, visited);
}
public int dfs(int i, int j, int m, int n, int k, boolean[][] visited) {
// 行列索引越界
if( i >= m || j >= n ) return 0;
// 数位和超出目标值 k ,即不满足行坐标和列坐标的数位之和小于 k 的格子
if( k < sum( i , j ) ) return 0;
// 已经被访问过的重复格子
if ( visited[i][j] ) return 0;
//机器人进入了一个新格子,标注这个格子被访问过
visited[i][j] = true;
//沿着当前格子的右边和下边继续访问
return 1 + dfs( i + 1, j , m , n , k , visited ) + dfs( i , j + 1, m , n , k , visited);
}
//计算两个坐标数字的和
private int sum(int i, int j) {
int sum = 0;
while (i != 0) {
// 通过求余和取整的操作来计算
sum += i % 10;
i /= 10;
}
while (j != 0) {
sum += j % 10;
j /= 10;
}
return sum;
}
}
剑指 Offer 13. 机器人的运动范围
最新推荐文章于 2022-05-30 20:36:39 发布