剑指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;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
6月前
|
机器人
剑指 Offer 13:机器人的运动范围
剑指 Offer 13:机器人的运动范围
49 0
|
3月前
|
数据可视化 机器人 Python
实例9:四足机器人运动学正解平面RR单腿可视化
本文是关于四足机器人正向运动学(FK)的实例教程,通过Python编程实现了简化的mini pupper平面二连杆模型的腿部可视化,并根据用户输入的关节角计算出每个关节相对于基坐标系的坐标。
68 1
|
3月前
|
机器人
PUN ☀️六、机器人基础设置:运动、相机、攻击与生命值
PUN ☀️六、机器人基础设置:运动、相机、攻击与生命值
|
3月前
|
数据可视化 算法 机器人
实例10:四足机器人运动学逆解可视化与实践
本文是关于四足机器人逆运动学(IK)的实例教程,介绍了逆运动学的概念、求解方法、多解情况和工作空间,并通过Python编程实现了简化的mini pupper平面二连杆模型的逆运动学可视化,包括单腿舵机的校准和动态可视化运动学计算结果。
164 0
|
6月前
|
NoSQL 机器人 Windows
ROS机器人编程技术控制两只小海龟的编队运动
ROS机器人编程技术控制两只小海龟的编队运动
237 1
|
6月前
|
机器人 Python
Moveit + Gazebo实现联合仿真:ABB yumi双臂机器人( 二、双臂协同运动实现 )
Moveit + Gazebo实现联合仿真:ABB yumi双臂机器人( 二、双臂协同运动实现 )
|
6月前
|
机器学习/深度学习 人工智能 机器人
[译][AI 机器人] Atlas的电动新时代,不再局限于人类运动范围的动作方式
波士顿动力宣布液压Atlas机器人退役,推出全新电动Atlas,旨在实现更广泛的实际应用。这款全电动机器人将拓展人类运动范围,解决复杂工业挑战。现代汽车公司将参与其商业化进程,作为测试应用场景。波士顿动力计划与创新客户合作,逐步迭代Atlas的应用,打造高效、实用的移动机器人解决方案。Atlas将结合强化学习和计算机视觉等先进技术,通过Orbit软件平台进行管理,未来将在真实世界中发挥超越人类能力的作用。
|
4天前
|
自然语言处理 算法 机器人
智能电话销售机器人源码搭建部署系统电话机器人源码
智能电话销售机器人源码搭建部署系统电话机器人源码
15 4
|
15天前
|
机器学习/深度学习 传感器 算法
智能机器人在工业自动化中的应用与前景###
本文探讨了智能机器人在工业自动化领域的最新应用,包括其在制造业中的集成、操作灵活性和成本效益等方面的优势。通过分析当前技术趋势和案例研究,预测了智能机器人未来的发展方向及其对工业生产模式的潜在影响。 ###
61 9
|
7天前
|
机器学习/深度学习 人工智能 运维
电话机器人源码-智能ai系统-freeswitch-smartivr呼叫中心-crm
电话机器人源码-智能ai系统-freeswitch-smartivr呼叫中心-crm
25 0
下一篇
无影云桌面