【剑指Offer】机器人的运动范围

题目

地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7=18。但它不能进入方格(35,38)。因为3+5+3+8=19.请问该机器人能够到达多少个格子?

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public int movingCount(int threshold, int rows, int cols) {
boolean[] visited = new boolean[rows*cols];
return movingCountHelper(threshold, rows, cols, 0, 0, visited);
}

private int movingCountHelper(int threshold, int rows, int cols, int row, int col, boolean[] visited) {
if (row < 0 || col < 0 || row >= rows || col >= cols || visited[row*cols+col] || getDigitSum(row) + getDigitSum(col) > threshold)
return 0;

int count = 1;

visited[row*cols+col] = true;
count += movingCountHelper(threshold, rows, cols, row - 1, col, visited)
+ movingCountHelper(threshold, rows, cols, row + 1, col, visited)
+ movingCountHelper(threshold, rows, cols, row, col - 1, visited)
+ movingCountHelper(threshold, rows, cols, row, col + 1, visited);

return count;
}

private int getDigitSum(int num) {
int sum = 0;

while (num != 0) {
sum += num % 10;
num /= 10;
}

return sum;
}