剑指offer:机器人的运动范围

本文介绍了一个机器人在限定条件下能够达到的格子数量的问题,并提供了一种解决方案——使用回溯法来计算所有可能的路径。文章详细解释了算法的实现过程,并附带了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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

思路:

同样采用回溯法,movingCountCore()函数返回从当前位置出发最多能到达多少个格子,如果当前格子能进入,递归调用从当前格子的左右上下的格子出发的结果,最后从当前位置出发的结果就是1+4个方向的结果。如果当前格子不能进入,返回0。

注意:在这里,类似矩阵中的路径,还是需要一个bool矩阵存储有没有进入当前格子,如果有,就不能再次进入了,主要是为了不重复计数。

 

参考代码:

在线测试

https://www.nowcoder.com/practice/6e5207314b5241fb83f2329e89fdecc8?tpId=13&tqId=11219&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

AC代码

class Solution {
public:
    int movingCount(int threshold, int rows, int cols)
    {
        if(rows<=0||cols<=0||threshold<0)
            return 0;
        bool* visited=new bool[rows*cols];
        memset(visited,0,rows*cols);
        int result=movingCountCore(threshold, rows, cols, 0, 0, visited);//返回从0出发累加的结果
        return result;
    }
    int movingCountCore(int threshold, int rows, int cols,int row, int col, bool *visited)
    {
        int count=0;//首先清零
        if(checkIn(threshold, rows, cols, row, col, visited))
        {
            visited[row*cols+col]=true;
            //当前格子加上四个方向的累加结果
            count=1+movingCountCore(threshold, rows, cols, row, col-1, visited)+
                movingCountCore(threshold, rows, cols, row, col+1, visited)+
                movingCountCore(threshold, rows, cols, row-1, col, visited)+
                movingCountCore(threshold, rows, cols, row+1, col, visited);
        }
        return count;
    }
    //判断是否能进入当前格子
    bool checkIn(int threshold, int rows, int cols, int row, int col, bool *visited)
    {
        if(row>=0&&row<rows&&col>=0&&col<cols&&sumOfBit(row)+sumOfBit(col)<=threshold&&(!visited[row*cols+col]))
            return true;
        return false;
    }
    //计算各位的和
    int sumOfBit(int num)
    {
        int sum=0;
        while(num)
        {
            sum+=num%10;
            num=num/10;
        }
        return sum;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值