解析:采用回溯法,定义一个数组来记录机器人所到过的位置,防止重复计算,然后分别向四个方向移动,判断是否能到达。
代码如下:
public int movingCount(int threshold,int rows ,int cols) {
boolean[] visted = new boolean[rows * cols];
for (int i = 0; i < visted.length; i++) {
// 用这个数组来判断机器人是否经过了某个位置
visted[i] = false;
}
// 获取机器人最多可到达的位置
int count = movingCountCore(threshold,rows,cols,0,0,visted);
return count;
}
private int movingCountCore(int threshold, int rows, int cols, int row, int col, boolean[] visted) {
int count = 0;
if (check(threshold,rows,cols,row,col,visted)) {
// 判断符合条件后,将该位置标记为已经来过
visted[rows * cols + col] = true; // 代表访问过了的
// 向上下左右四个位置探索
count = 1 +
movingCountCore(threshold, rows , cols, row - 1, col, visted) +
movingCountCore(threshold, rows, cols, row, col - 1, visted) +
movingCountCore(threshold, rows, cols, row + 1, col, visted) +
movingCountCore(threshold, rows, cols, row, col + 1, visted);
}
return count;
}
private boolean check(int threshold, int rows, int cols, int row, int col, boolean[] visted) {
// 判断是否越界啦 判断和是否大于阀值
if (row >=0 && row < rows && col >= 0 && col < cols && (getDigitSum(row) + getDigitSum(col) <= threshold) && !visted[row * cols + col])
return true;
return false;
}
// 求坐标的和
private int getDigitSum(int row) {
int sum = 0;
while (row > 0) {
sum += row % 10;
row /= 10;
}
return sum;
}