【每日算法Day 94】经典面试题:机器人的运动范围
最近在忙面试,本来今天都不想更了,但是看基础知识看的太累了,于是写道题排解一下压力。
题目链接
LeetCode 面试题13. 机器人的运动范围[1]
题目描述
地上有一个 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
。请问该机器人能够到达多少个格子?
示例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++)
class Solution {public:int countDigit(int x, int y) {int sum = 0;while (x > 0) {sum += x % 10;x /= 10;}while (y > 0) {sum += y % 10;y /= 10;}return sum;}int movingCount(int m, int n, int k) {int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int res = 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++;int nx = p.first, ny = p.second;for (int i = 0; i < 4; ++i) {int x = 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});}}}return res;}
};
DFS(c++)
class Solution {public:int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int countDigit(int x, int y) {int sum = 0;while (x > 0) {sum += x % 10;x /= 10;}while (y > 0) {sum += y % 10;y /= 10;}return sum;}int dfs(int nx, int ny, vector<vector<int> >& vis, int& m, int& n, int& k) {int res = 1;for (int i = 0; i < 4; ++i) {int x = 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);}}return res;}int movingCount(int m, int n, int k) {vector<vector<int> > vis(m, vector<int>(n, 0));vis[0][0] = 1;int res = dfs(0, 0, vis, m, n, k);return res;}
};
参考资料
[1]
LeetCode 面试题13. 机器人的运动范围: https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/
【每日算法Day 94】经典面试题:机器人的运动范围相关推荐
- python【力扣LeetCode算法题库】面试题13- 机器人的运动范围(BFS)
面试题13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动 ...
- 前端面试instanceof_一起回归一下每日一题这些经典面试题
" 需求已改活已加,加班通宵看朝霞.终是上线已延期,bug还是改不完. 面试造火箭,工作拧螺丝,虽然我只想拧螺丝,可是我需要用造火箭的技术去寻找拧螺丝的工作,如何能在面试过程中让自己处于不败 ...
- C/C++面试题—机器人的运动范围【回溯法应用】
题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子.例如,当k为18时,机器人能够 ...
- 每日一道Leetcode - 剑指 Offer 13. 机器人的运动范围【DFS|BFS】
DFS: Python版本 class Solution:def movingCount(self, m: int, n: int, k: int) -> int:def dfs(i,j,si, ...
- 数据结构经典面试题-图
本系列针对面试中[经典]手写算法题进行分类和汇总,每篇主要包含两大部分:基础知识和面试经典题目. 本篇的主角是[图],说实话,图的相关算法不是很多,但是这些经典算法在面试中会经常出现,因为:图算法相对 ...
- 【每日算法】C语言8大经典排序算法(2)
接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...
- 搬砖:算法经典面试题
算法经典面试题 https://blog.csdn.net/pcpanchen/article/details/16851151 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将 ...
- < 每日算法 - Javascript解析:经典弹珠游戏 >
每日算法 - JavaScript解析:弹珠游戏 一.任务描述: > 示例一: >示例二 二.题意解析 三.解决方案: 往期内容
- 字节跳动10年经验,10W字228道软件测试经典面试题总结(附答案)
前言 最近有很多粉丝问我,有什么方法能够快速提升自己,通过阿里.腾讯.字节跳动.京东等互联网大厂的面试,我觉得短时间提升自己最快的手段就是背面试题,最近总结了软件测试常用的面试题,分享给大家,希望大家 ...
- 【Linux 经典面试题】
[Linux 经典面试题] 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文 ...
最新文章
- SpringBoot在Tomcat下面启动,访问路径
- 基于matlab fdma传输系统设计,基于MATLAB的LTE系统仿真研究
- MATLAB中的varargin,varargout在函数中运用
- 从民宅到独栋大厦 我们搬家啦!
- linux fedora自定义终端terminal的快捷键
- 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组
- Vue axios 中提交表单数据(含上传文件)
- leetcode 27. 移除元素(双指针)
- 【Java】Java反射异常处理之InvocationTargetException
- 买断式软件逐渐向订阅式软件发展,是不是资本想一直割韭菜?
- Android架构学习之路三-MVX
- 存储和多屏互动,蜂鸟网的NAS应用解析
- Linux下parity联盟链的实现
- 为张孝祥老师的离世表示哀悼
- 百度语音合成模型Deep Voice3
- Python - 删除print()中的空格
- vue之实现移动端的复制粘贴功能(两种写法)
- window屏幕保护程序没有可以设置的选项
- 2020春节寒假总结
- 从三个产业侧影,打开万物智能的应用之匙