public class Solution {
    public int movingCount(int threshold, int rows, int cols) {

        if (threshold < 0 || rows <= 0 || cols <= 0){
            return 0;
        }

        boolean[][] visited = new boolean[rows][cols];

        return countByDFS(threshold,0,0,visited,rows,cols);

    }

    private int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};
    private int countByDFS(int threshold,int row,int col,boolean[][] visited,int rows,int cols){
        int count = 0;
        if (validCheck(threshold,row,col,visited,rows,cols)){

            visited[row][col] = true;
            count++;
            for (int[] dir : dirs) {
                count += countByDFS(threshold,row+dir[0],col+dir[1],visited,rows,cols);
            }
        }

        return count;
    }


    private boolean validCheck(int threshold,int row,int col,boolean[][] visited,int rows,int cols){

        if (row < 0 || col < 0 || row >= rows || col >= cols || visited[row][col] || (getSum(row) + getSum(col)) > threshold){

            return false;
        }

        return true;
    }

    private int getSum(int num){

        int sum = 0;

        while ( num > 0 ){

            sum += num % 10;
            num /= 10;
        }
        return sum;
    }
}