剑指offer 12. 机器人的运动范围

简介: 剑指offer 12. 机器人的运动范围

题目描述

地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。


一个机器人从坐标 (0,0) 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。


但是不能进入行坐标和列坐标的数位之和大于 k 的格子。


请问该机器人能够达到多少个格子?


注意:

  1. 0<=m<=50
  2. 0<=n<=50
  3. 0<=k<=100



样例1

输入:k=7, m=4, n=5
输出:20


样例2

输入:k=18, m=40, n=40
输出:1484
解释:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。
      但是,它不能进入方格(35,38),因为3+5+3+8 = 19。


方法一:BFS O(n)


这道题我们直接用宽搜来做,从 (0,0) 开始往外扩展,也是一道基本的模板题。具体思路如下,我们拿 k=3,m=4,n=5 这个情况来举例:


第一步: 如果行数或列数为 0 的话直接返回 0 ,但是这里不为 0 ,所以继续执行下面的操作。


第二步: 这道题我们可以从坐标 (0,0) 开始进行 bfs ,用一个队列来保存后续满足要求的坐标,最开始先推入 (0,0) ,因为它的 x+y<k 满足要求。

e2087b73cc8a4548b02f572e71da5ea1.png


第三步: 开始 bfs ,将队列的队首元素推出,得到 (0,0) ,然后去遍历它的上下左右四个方向上的格子,如果满足要求则加入队列。bfs 其实就像从一个点开始,一层一层的往外进行遍历,如果遇到满足要求的点就加入到数组中去。

6529d404aa884b59b8e25b143b9e96ff.png


第四步: 只要队列不为空,就一直往外遍历,这里就直接放图啦。


55e21f2f9c414157b759188f92c68c2b.png


5fbbdaf8d3a74b7195cd7c70ba3c9cb8.png


第五步: 由于 k=3 ,故只要 x+y>k 的地方都不能到达,所以最后会返回答案 res=10

76f65b88429344b48749f724cef5560d.png

class Solution {
public:
    //计算数的每位之和
    int cal(int x)
    {
        int ans = 0;
        for (; x; x /= 10)
            ans += x % 10;
        return ans;
    }
    int dx[4] = { 0,-1,0,1 }, dy[4] = { 1,0,-1,0 };
    int movingCount(int threshold, int rows, int cols)
    {
        if (!rows || !cols)    return 0;
        queue<pair<int, int>> q;  
        vector<vector<int>> table(rows, vector<int>(cols, 0));  //用来判断是否当前位置已经遍历过
        //将(0,0)先push进去
        table[0][0] = 1;
        q.push({ 0,0 });
        int ans = 0;
        //开始bfs
        while (!q.empty())
        {
            auto it = q.front();
            q.pop();
            ans++;
            for (int i = 0; i < 4; i++)
            {
                int mr = it.first + dx[i], mc = it.second + dy[i];
                //判断当前
                if (mr < 0 || mr >= rows || mc < 0 || mc >= cols || table[mr][mc])    continue;
                if (cal(mr) + cal(mc) > threshold)   continue;
                table[mr][mc] = 1;  //记录当前位置已经走过
                q.push({ mr,mc });
            }
        }
        return ans;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
3月前
|
算法 机器人 Python
机器人逆运动学进阶:李代数、矩阵指数与旋转流形计算
本文深入讲解机器人逆运动学中旋转计算的核心数学工具,包括矩阵指数与对数、SO(3)李群与李代数、流形和切空间等概念,帮助理解三维旋转误差计算原理,并提供基于矩阵指数的精确旋转更新方法及代码实现。
230 1
机器人逆运动学进阶:李代数、矩阵指数与旋转流形计算
|
4月前
|
传感器 算法 定位技术
KF,EKF,IEKF 算法的基本原理并构建推导出四轮前驱自主移动机器人的运动学模型和观测模型(Matlab代码实现)
KF,EKF,IEKF 算法的基本原理并构建推导出四轮前驱自主移动机器人的运动学模型和观测模型(Matlab代码实现)
156 2
|
8月前
|
传感器 人工智能 算法
傅利叶开源人形机器人,提供完整的开源套件!Fourier N1:具备23个自由度和3.5米/秒运动能力
傅利叶推出的开源人形机器人N1搭载自研动力系统与多模态交互模块,具备23个自由度和3.5米/秒运动能力,提供完整开源套件助力开发者验证算法。
677 3
傅利叶开源人形机器人,提供完整的开源套件!Fourier N1:具备23个自由度和3.5米/秒运动能力
|
9月前
|
算法 机器人 数据安全/隐私保护
四自由度SCARA机器人的运动学和动力学matlab建模与仿真
本课题深入研究SCARA机器人系统,提出其动力学与运动学模型,并基于MATLAB Robotics Toolbox建立四自由度SCARA机器人仿真对象。通过理论结合仿真实验,实现了运动学正解、逆解及轨迹规划等功能,完成系统实验和算法验证。SCARA机器人以其平面关节结构实现快速定位与装配,在自动生产线中广泛应用,尤其在电子和汽车行业表现优异。使用D-H参数法进行结构建模,推导末端执行器的位姿,建立了机器人的运动学方程。
|
数据可视化 机器人 Python
实例9:四足机器人运动学正解平面RR单腿可视化
本文是关于四足机器人正向运动学(FK)的实例教程,通过Python编程实现了简化的mini pupper平面二连杆模型的腿部可视化,并根据用户输入的关节角计算出每个关节相对于基坐标系的坐标。
372 1
PUN ☀️六、机器人基础设置:运动、相机、攻击与生命值
PUN ☀️六、机器人基础设置:运动、相机、攻击与生命值
|
数据可视化 算法 机器人
实例10:四足机器人运动学逆解可视化与实践
本文是关于四足机器人逆运动学(IK)的实例教程,介绍了逆运动学的概念、求解方法、多解情况和工作空间,并通过Python编程实现了简化的mini pupper平面二连杆模型的逆运动学可视化,包括单腿舵机的校准和动态可视化运动学计算结果。
1123 0
|
3月前
|
数据采集 自动驾驶 机器人
数据喂得好,机器人才能学得快:大数据对智能机器人训练的真正影响
数据喂得好,机器人才能学得快:大数据对智能机器人训练的真正影响
240 1
|
9月前
|
人工智能 自然语言处理 机器人
9.9K star!大模型原生即时通信机器人平台,这个开源项目让AI对话更智能!
"😎高稳定、🧩支持插件、🦄多模态 - 大模型原生即时通信机器人平台"
310 0
|
7月前
|
弹性计算 自然语言处理 Ubuntu
从0开始在阿里云上搭建基于通义千问的钉钉智能问答机器人
本文描述在阿里云上从0开始构建一个LLM智能问答钉钉机器人。LLM直接调用了阿里云百炼平台提供的调用服务。
从0开始在阿里云上搭建基于通义千问的钉钉智能问答机器人

热门文章

最新文章