【每日算法Day 94】经典面试题:机器人的运动范围

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

题目链接


LeetCode 面试题13. 机器人的运动范围[1]

题目描述


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

示例1

输入:m = 2, n = 3, k = 1输出:3

示例2

输入:m = 3, n = 1, k = 0输出:1

说明:

  • 1 <= n,m <= 100
  • 0 <= k <= 20

题解


这道题没有什么算法,比较简单,主要考察你的代码实现能力,这里我写了两个方法,一个 BFS,一个 DFS。

BFS

BFS 的思路就是用一个队列来保存即将要访问的结点,然后不断出队,将当前结点的四周的结点满足要求的入队。为了避免重复访问,可以用一个 vis 数组来标记已经访问过的结点位置。

DFS

DFS 思路就更加清晰简单了,对于一个结点来说,从它出发可以访问到的结点总数就等于从它四周的结点出发可以访问到的结点总数加一。同样需要用一个 vis 数组来标记已经访问过的结点位置。

代码


BFS(c++)

classSolution {
public:  
intcountDigit(intx, inty) {      
intsum=0;      
while (x>0) {   
sum+=x%10;       
x/=10;     
        }       
while (y>0) { 
sum+=y%10;  
y/=10;      
        }       
returnsum;  
    }
intmovingCount(intm, intn, intk) {   
intdx[4] = {0, 0, 1, -1};   
intdy[4] = {1, -1, 0, 0};   
intres=0;       
vector<vector<int>>vis(m, vector<int>(n, 0));  
queue<pair<int, int>>Q;    
Q.push({0, 0});      
vis[0][0] =1;       
while (!Q.empty()) {      
pair<int, int>p=Q.front();     
Q.pop();       
res++;         
intnx=p.first, ny=p.second;     
for (inti=0; i<4; ++i) {   
intx=nx+dx[i], y=ny+dy[i];   
if (0<=x&&x<m&&0<=y&&y<n&&!vis[x][y]
&&countDigit(x, y) <=k) {    
vis[x][y] =1;    
Q.push({x, y});     
                }       
            }  
        }    
returnres;  
    }
};

DFS(c++)

classSolution {
public:  
intdx[4] = {0, 0, 1, -1};    intdy[4] = {1, -1, 0, 0};
intcountDigit(intx, inty) {    
intsum=0;     
while (x>0) {  
sum+=x%10;   
x/=10;    
        }      
while (y>0) {  
sum+=y%10;     
y/=10;    
        }       
returnsum;  
    }
intdfs(intnx, intny, vector<vector<int>>&vis, int&m, int&n, int&k) { 
intres=1;     
for (inti=0; i<4; ++i) {   
intx=nx+dx[i], y=ny+dy[i];  
if (0<=x&&x<m&&0<=y&&y<n&&!vis[x][y] &&countDigit(x, y) <=k) {    
vis[x][y] =1; 
res+=dfs(x, y, vis, m, n, k);   
            }   
        }     
returnres;  
    }
intmovingCount(intm, intn, intk) {   
vector<vector<int>>vis(m, vector<int>(n, 0)); 
vis[0][0] =1;    
intres=dfs(0, 0, vis, m, n, k);   
returnres; 
    }
};

参考资料

[1]

LeetCode 面试题13. 机器人的运动范围: https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~

相关文章
|
3月前
|
传感器 算法
船舶运动控制,PID控制算法,反步积分控制器
船舶运动控制,PID控制算法,反步积分控制器
|
3月前
|
算法 机器人 Python
机器人逆运动学进阶:李代数、矩阵指数与旋转流形计算
本文深入讲解机器人逆运动学中旋转计算的核心数学工具,包括矩阵指数与对数、SO(3)李群与李代数、流形和切空间等概念,帮助理解三维旋转误差计算原理,并提供基于矩阵指数的精确旋转更新方法及代码实现。
231 1
机器人逆运动学进阶:李代数、矩阵指数与旋转流形计算
|
4月前
|
传感器 算法 定位技术
KF,EKF,IEKF 算法的基本原理并构建推导出四轮前驱自主移动机器人的运动学模型和观测模型(Matlab代码实现)
KF,EKF,IEKF 算法的基本原理并构建推导出四轮前驱自主移动机器人的运动学模型和观测模型(Matlab代码实现)
156 2
|
4月前
|
传感器 算法 安全
【路径规划】基于matlab A_Star结合DWA算法电气设备巡检机器人路径规划研究(Matlab代码实现)
【路径规划】基于matlab A_Star结合DWA算法电气设备巡检机器人路径规划研究(Matlab代码实现)
150 0
|
5月前
|
存储 算法 数据安全/隐私保护
基于FPGA的图像退化算法verilog实现,分别实现横向和纵向运动模糊,包括tb和MATLAB辅助验证
本项目基于FPGA实现图像运动模糊算法,包含横向与纵向模糊处理流程。使用Vivado 2019.2与MATLAB 2022A,通过一维卷积模拟点扩散函数,完成图像退化处理,并可在MATLAB中预览效果。
|
8月前
|
传感器 人工智能 算法
傅利叶开源人形机器人,提供完整的开源套件!Fourier N1:具备23个自由度和3.5米/秒运动能力
傅利叶推出的开源人形机器人N1搭载自研动力系统与多模态交互模块,具备23个自由度和3.5米/秒运动能力,提供完整开源套件助力开发者验证算法。
685 3
傅利叶开源人形机器人,提供完整的开源套件!Fourier N1:具备23个自由度和3.5米/秒运动能力
|
6月前
|
机器学习/深度学习 算法 数据可视化
基于Qlearning强化学习的机器人迷宫路线搜索算法matlab仿真
本内容展示了基于Q-learning算法的机器人迷宫路径搜索仿真及其实现过程。通过Matlab2022a进行仿真,结果以图形形式呈现,无水印(附图1-4)。算法理论部分介绍了Q-learning的核心概念,包括智能体、环境、状态、动作和奖励,以及Q表的构建与更新方法。具体实现中,将迷宫抽象为二维网格世界,定义起点和终点,利用Q-learning训练机器人找到最优路径。核心程序代码实现了多轮训练、累计奖励值与Q值的可视化,并展示了机器人从起点到终点的路径规划过程。
277 0
|
11月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
418 68
|
9月前
|
算法
面试场景题:如何设计一个抢红包随机算法
本文详细解析了抢红包随机算法的设计与实现,涵盖三种解法:随机分配法、二倍均值法和线段切割法。随机分配法通过逐次随机分配金额确保总额不变,但易导致两极分化;二倍均值法优化了金额分布,使每次抢到的金额更均衡;线段切割法则将总金额视为线段,通过随机切割点生成子金额,手气最佳金额可能更高。代码示例清晰,结果对比直观,为面试中类似算法题提供了全面思路。
1472 16
|
9月前
|
算法 机器人 数据安全/隐私保护
四自由度SCARA机器人的运动学和动力学matlab建模与仿真
本课题深入研究SCARA机器人系统,提出其动力学与运动学模型,并基于MATLAB Robotics Toolbox建立四自由度SCARA机器人仿真对象。通过理论结合仿真实验,实现了运动学正解、逆解及轨迹规划等功能,完成系统实验和算法验证。SCARA机器人以其平面关节结构实现快速定位与装配,在自动生产线中广泛应用,尤其在电子和汽车行业表现优异。使用D-H参数法进行结构建模,推导末端执行器的位姿,建立了机器人的运动学方程。