座標[0,0]から座標[m-1、n-1]まで、地面にm行n列のグリッドがあります。ロボットは座標[0、0]のグリッドから開始し、一度に1つのグリッドを左、右、上、下に移動できます(グリッドの外に移動できません)。また、行と列の座標を入力できません。数字の合計は、 kの格子。たとえば、kが18の場合、3 + 5 + 3 + 7 = 18であるため、ロボットは正方形[35、37]に入ることができます。しかし、3 + 5 + 3 + 8 = 19であるため、正方形[35、38]に入ることができません。ロボットが到達できるグリッドはいくつですか?
ディープサーチ:ディープサーチで行列をトラバースし、ディープサーチの境界を制御し、現在のアクセスの数と位置がk以下かどうかを判断します。また、二重計算を防ぐために各場所のアクセスを記録するマーカー配列が必要です。
class Solution {
public int movingCount(int m, int n, int k) {
boolean[][] visited = new boolean[m][n];
return dfs(0, 0, m, n, k, visited);
}
private int dfs(int x, int y, int m, int n, int k, boolean[][] visited) {
if (x == m || y == n || sum(x) + sum(y) > k || visited[x][y]) {
return 0;
}
visited[x][y] = true;
return 1 + dfs(x + 1, y, m, n, k, visited) + dfs(x, y + 1, m, n, k, visited);
}
// 获取一个整数的数位和
private int sum(int num) {
int res = 0;
while (num > 0) {
res += num % 10;
num /= 10;
}
return res;
}
}