AcWing打卡活动
《剑指Offer》打卡活动
周二第一题 机器人的运动范围
class Solution {
public int movingCount(int threshold, int rows, int cols)
{
// 给了m,n,k的范围,所以不需要进行校验
// 需要一个数组维护机器人是否进入过该格子
Boolean[] visited = new Boolean[rows * cols];
// 初始化机器人走过的格子 false为未走
for(int i = 0; i < visited.length; i++) {
visited[i] = false;
}
int count = movingCountCore(threshold, rows, cols, 0, 0, visited);
return count;
}
public int movingCountCore(int threshold, int rows, int cols, int row, int col, Boolean[] visited) {
if(row < 0 || row >= rows || col < 0|| col >= cols) {
return 0;
}
int count = 0;
if(check(threshold, row, col, rows, cols, visited)) {
// 置当前格子为走过
visited[row * cols + col] = true;
count = 1 + movingCountCore(threshold, rows, cols, row + 1, col, visited)
+ movingCountCore(threshold, rows, cols, row - 1, col, visited)
+ movingCountCore(threshold, rows, cols, row, col + 1, visited)
+ movingCountCore(threshold, rows, cols, row, col - 1, visited);
}
return count;
}
// 校验机器人是否可以进入该格子
public Boolean check(int threshold, int row, int col, int rows, int cols, Boolean[] visited) {
// 此格子是否已经走过
if(!visited[cols * row + col] && getDitSum(row) + getDitSum(col) <= threshold) {
return true;
}
return false;
}
// 获取数字位数之和
public int getDitSum(int number) {
int sum = 0;
while(number > 0) {
sum += number % 10;
number /= 10;
}
return sum;
}
}