66、机器人的运动范围 十分经典的题目

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,
每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。
例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。
但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
示例1
输入

5,10,10

返回值

21
1、借助标记法,看的解释,其实很好理解和明白
bool canReach(int threshold, int x, int y) {
    int sum = 0;
    while (x > 0) {
        sum += x % 10;
        x /= 10;
    }
    while (y > 0) {
        sum += y % 10;
        y /= 10;
    }
    return sum <= threshold;
}

int movingCountCore(int threshold, int i, int rows,int j ,int cols, vector<vector<bool>>&visit) {
    if (i < 0 || i >= rows || j < 0 || j >= cols || !canReach(threshold, i, j) || visit[i][j] == true) return 0;
    //边界值不满足,不能到达或者已经走过了,也到达不了,返回0
    visit[i][j] = true; // 当前已经走过了,并且满足要求,所有后续return 要加上1

    return movingCountCore(threshold, i - 1, rows, j, cols, visit) + //分别是上下左右各个方向判断一下
        movingCountCore(threshold, i + 1, rows, j, cols, visit) +
        movingCountCore(threshold, i , rows, j-1, cols, visit) +
        movingCountCore(threshold, i, rows, j+1, cols, visit) + 1;

}
int movingCount(int threshold, int rows, int cols)
{
    vector<vector<bool>> visit(rows,vector<bool>(cols,false));
    return movingCountCore(threshold, 0,  rows, 0, cols, visit);

}
2、标注借助法的简化版

递归只要俩行就够了,helper(threshold, rows, cols, flags, i + 1, j) + helper(threshold, rows, cols, flags, i, j + 1) + 1,不需要往回走,然后前面的判断i,j也不会小于零了

因为是从(0 0 ),开始走的,所以只需要判断向上和向右的情况即可

bool canReach(int threshold, int x, int y) {
    int sum = 0;
    while (x > 0) {
        sum += x % 10;
        x /= 10;
    }
    while (y > 0) {
        sum += y % 10;
        y /= 10;
    }
    return sum <= threshold;
}

int movingCountCore(int threshold, int i, int rows,int j ,int cols, vector<vector<bool>>&visit) {
    if (i >= rows || j >= cols || !canReach(threshold, i, j) || visit[i][j] == true) return 0;
    //边界值不满足,不能到达或者已经走过了,也到达不了,返回0
    visit[i][j] = true; // 当前已经走过了,并且满足要求,所有后续return 要加上1

    return