思路
- 主要思路是遍历格子,然后确保格子之间是联通的。这里有个条件,就是需要格子的位置的数位之和要小于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.