public class Solution {
    public int movingCount(int threshold, int rows, int cols) {
        return dfs(threshold,0,0,rows,cols,new boolean[rows][cols]) ;
    }
    
    /*
    从坐标i , j出发所能到达最多的格子数
    */
    public int dfs(int threshold , int i , int j , int rows , int cols ,boolean isvisit[][]) {
        if(i < 0 || i >= rows || j < 0 || j >= cols) {
            return 0 ;
        }
        if(isvisit[i][j]) {
            return 0 ;
        }
        if(bitSum(i,j) > threshold) {
            return 0 ;
        }
        isvisit[i][j] = true ;
        int[] maxTemp = new int[4] ;
        maxTemp[0] = dfs(threshold,i-1,j,rows,cols,isvisit) ;
        maxTemp[1] = dfs(threshold,i+1,j,rows,cols,isvisit) ;
        maxTemp[2] = dfs(threshold,i,j-1,rows,cols,isvisit) ;
        maxTemp[3] = dfs(threshold,i,j+1,rows,cols,isvisit) ;
        int sum = 0 ;
        //所有路径中经过的格子之和
        for(int k = 0 ; k < 4 ; k ++) {
            sum += maxTemp[k] ;
        }
        //isvisit[i][j] = false ;  这里不必还原现场,因为需求是统计及其所有路径中能到的格子总数,
        //每个格子只能计算一次,如果还原现场则每个格子可能会被计算多次
        return sum+1 ;
    }
    //求坐标的数位之和
    public int bitSum(int r , int c) {
        int sum = 0 ;
        while(r != 0) {
            sum += (r % 10 );
            r /= 10 ;
        }
        while(c != 0) {
            sum += (c % 10) ;
            c /= 10 ;
        }
        return sum ;
    }
}