【每日算法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天前
|
存储 算法 编译器
米哈游面试算法题:有效的括号
米哈游面试算法题:有效的括号
28 0
|
3天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
49 0
|
1天前
|
算法 前端开发 Android开发
Android文字基线Baseline算法的使用讲解,Android开发面试题
Android文字基线Baseline算法的使用讲解,Android开发面试题
Android文字基线Baseline算法的使用讲解,Android开发面试题
|
1天前
|
算法 Java API
Groovy脚本基础全攻略,android面试算法题
Groovy脚本基础全攻略,android面试算法题
|
2天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
2天前
|
算法 架构师 网络协议
对标腾讯T9架构师的 Android 面试题新鲜出炉,算法真的太重要了
对标腾讯T9架构师的 Android 面试题新鲜出炉,算法真的太重要了
|
2天前
|
移动开发 算法 搜索推荐
2024最新Android算法相关面试大全,请查收
2024最新Android算法相关面试大全,请查收
|
3天前
|
NoSQL 机器人 Windows
ROS机器人编程技术控制两只小海龟的编队运动
ROS机器人编程技术控制两只小海龟的编队运动
8 1
|
3天前
|
机器人 Python
Moveit + Gazebo实现联合仿真:ABB yumi双臂机器人( 二、双臂协同运动实现 )
Moveit + Gazebo实现联合仿真:ABB yumi双臂机器人( 二、双臂协同运动实现 )
|
3天前
|
存储 缓存 算法
面试遇到算法题:实现LRU缓存
V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。

热门文章

最新文章