思路

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


每一个平凡的日常都是连续的奇迹