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

网友投稿 592 2022-10-14

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

【每日算法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 > vis(m, vector(n, 0)); queue > Q; Q.push({0, 0}); vis[0][0] = 1; while (!Q.empty()) { pair 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 >& 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 > vis(m, vector(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/​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:超大背包问题(折半枚举, 双向搜索)
下一篇:【每日算法Day 99】你们可能不知道只用20万赢到578万是什么概念
相关文章

 发表评论

暂时没有评论,来抢沙发吧~