class Solution {
public:
    int movingCount(int threshold, int rows, int cols) {
        if(rows == 0 && cols == 0) return 0;  //特殊情况判断
        int rec[rows][cols],use[rows][cols];  //rec用于记录当前格子是否符合要求,use用于记录当前格子是否已经考虑过
        int res = 0;  //返回的结果数
        for(int i = 0; i < rows; i ++) {   //这一层循环用于对rec初始化,符号进入条件填0,否则填1
            for(int j = 0;j < cols; j ++) {
                int sum = 0,a = i,b = j;   //sum用于记录横纵坐标各位之和
                while(a != 0){
                    sum += a % 10;
                    a = a / 10;
                }
                while(b != 0){
                    sum += b % 10;
                    b = b / 10;
                }
                if(sum > threshold) rec[i][j] = 1;
                else rec[i][j] = 0;
            }
        }
        for(int i = 0; i < rows; i ++) {   //初始化use,0代表当前格子没有被计算过
            for(int j = 0;j < cols; j ++) use[i][j] = 0;
        }
        queue<pair<int,int>> que;  //定义队列模拟广度优先BFS
        que.push({0,0});  //插入0,0
        use[0][0] = 1;  //更改use0,0
        while(que.size() != 0){  //队不空,就一直访问,直到队空,每次寻找下边的和右边的格子
            if(que.front().first + 1 < rows && rec[que.front().first + 1][que.front().second] == 0 && use[que.front().first + 1][que.front().second] == 0){
                que.push({que.front().first + 1,que.front().second});
                use[que.front().first + 1][que.front().second] = 1;
            } //如果下边格子满足条件,坐标入队,更改use标记
            if(que.front().second + 1 < cols && rec[que.front().first][que.front().second + 1] == 0 && use[que.front().first][que.front().second + 1] == 0){
                que.push({que.front().first,que.front().second + 1});
                use[que.front().first][que.front().second + 1] = 1;
            } //如果右边格子满足条件,坐标入队,更改use标记
            que.pop();  //队头出队,队列中都是满足条件的格子,res++
            res++;
        }
        return res;
    }
};