public class Solution {
    boolean [][]visited;//保证了格子不会重复计数
    public int movingCount(int threshold, int rows, int cols)
    {
        visited = new boolean[rows][cols];//默认是false
        return dfs(threshold,rows,cols,0,0,0,0);//从00开始,位数和为00
    }

    private int dfs(int k, int rows, int cols,int x,int y,int xSum,int ySum){
        //先做边界判断,如果超出边界则这一步可抵达的格子数为0
        if(x>rows-1||y>cols-1) return 0;
        //判断当前格子是否满足要求
        if(xSum+ySum>k||visited[x][y]==true) return 0;
        //如果当前格子满足要求,1+往下走或者往右走可以到达的格子数
        visited[x][y] = true;
        return 1+dfs(k,rows,cols,x+1,y,(x+1)%10==0?xSum-8:xSum+1,ySum)+dfs(k,rows,cols,x,y+1,xSum,(y+1)%10==0?ySum-8:ySum+1);
    }   
}