思路
- 主要思路是遍历格子,然后确保格子之间是联通的。这里有个条件,就是需要格子的位置的数位之和要小于k,也就是只有在该位置是可达变量(即从0,0到该位置可联通)且数位之和小于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);
}
public int dfs (int x,int y,int m,int n, int k,boolean[][] visited) {
// 各个数位相加大于k的位置是不可访问的位置,或者已经访问过的位置
if (x < 0 || x >= m || y < 0 || y >= n || get(x) + get(y) > k || visited[x][y]) {
return 0;
}
visited[x][y] = true;
// 从0,0起始,递归判断是下方和右方的方格是否可以连通
return dfs(x+1,y,m,n,k,visited) + dfs(x,y+1,m,n,k,visited) + 1;
}
int get(int num) {
int sum = 0;
while (num > 0) {
sum += num%10;
num = num / 10;
}
return sum;
}
}
Q.E.D.