剑指面试题13. 机器人的运动范围

解法1:创建矩阵记录访问情况

int bitSum(int num) {
    int sum = 0;
    while (num) {
        sum += num%10;
        num/=10;
    }
    return sum;
}
void movingRcu(int rows, int cols, int k, int row, int col, int *count, bool* visited) {
    if (row < 0 || row >= rows || col < 0 || col >= cols                      //越界检查
        || visited[row*cols + col] == true || (bitSum(row) + bitSum(col) > k))//未访问过且符合要求
        return;

    *count += 1;
    visited[row*cols + col] = true;
    movingRcu(rows, cols, k, row+1, col, count, visited);
    movingRcu(rows, cols, k, row, col+1, count, visited);
}
int movingCount(int m, int n, int k) {
    if (m <= 0 || n <= 0 || k < 0)      //不是k <= 0
        return 0;
    
    int cnt = 0;
    bool *visited = (bool *)calloc(m*n, sizeof(bool));
    movingRcu(m, n, k, 0, 0, &cnt, visited);
    free(visited);

    return cnt;
}

注:

1:如果不创建矩阵记录,直接递归查找的话,会栈溢出。

2:如果提交出现heap-buffer-overflow错误,请检查数组是否出现越界访问,或者检查数组创建类型和其传递类型是否一致。

3:由题意可知,机器人能达到的格子只可能从矩阵的左上角往右下角查验,而在(0,0)出发,只向下和向右移动即可满足情况。(0,0)是其相邻格子的上面和左边格子,访问某个格子的时候,其相邻上面和左边的有效格子一定是访问过的。

4:linux下编译.C文件可参考linux中怎么用gcc编译c文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值