public class Solution {
    
    public int threshold;
    public int rows;
    public int cols;
    
    public int movingCount(int threshold, int rows, int cols) {
        // 初始化
        this.threshold = threshold;
        this.rows = rows;
        this.cols = cols;

        int[][] matrix = new int[rows][cols]; // 定义一个整型数组,用于存放哪些位置可达    0: 表示当前位置不可达    1: 表示当前位置可达
        int[][] sign = new int[rows][cols]; // 定义一个整型数组,用于存放哪些位置已经访问过    0: 未访问过    1: 访问过
        process(matrix, 0, 0, sign);
        
        int res = 0; // 定义一个整型变量,用于存放最终的返回结果
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (matrix[i][j] == 1) {
                    res++;
                }
            }
        }
        return res;
    }
    
    public void process(int[][] matrix, int x, int y, int[][] sign) {
        if (x < 0 || x >= rows || y < 0 || y >= cols || sign[x][y] == 1) { // 如果越界或者当前位置已经访问过,直接返回
            return;
        }
        sign[x][y] = 1; // 记录当前位置访问过
        if (!isValid(x, y)) { // 判断当前位置是否可达
            return; // 如果不可达,直接返回
        }
        matrix[x][y] = 1; // 如果可达,记录当前位置
        // 同时访问当前位置的上下左右
        process(matrix, x - 1, y, sign);
        process(matrix, x + 1, y, sign);
        process(matrix, x, y - 1, sign);
        process(matrix, x, y + 1, sign);
        sign[x][y] = 0; // 别忘了进行回溯
    }
    
    // 判断当前位置的坐标位数和是否小于 threshold
    public boolean isValid(int x, int y) {
        StringBuffer sb = new StringBuffer("");
        sb.append(x);
        sb.append(y);
        int num = 0;
        for (int i = 0; i < sb.length(); i++) {
            num += Integer.valueOf(sb.charAt(i) + "");
        }
        if (num <= threshold) {
            return true;
        }
        else {
            return false;
        }
    }
}