同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree
机器人的运动范围
地上有一个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
通过次数145,986提交次数278,894
深度优先搜索:可以理解为暴力法遍历矩阵中所有字符串可能性。
算法流程:
//面试题13. 机器人的运动范围
//标准做法
class Solution {
public:
int count = 0;
int movingCount(int m, int n, int k) {
if (k == 0) return 1;
vector<vector<int>> visited(m, vector<int>(n));
dfs(visited, 0, 0, m, n, k);
return count;
}
void dfs(vector<vector<int>>& visited, int x, int y, int& m, int& n, int k)
{
if (x >= m || x < 0 || y >= n || y<0 || (x / 10 + x % 10 + y / 10 + y % 10)>k || visited[x][y] == 1)
return;
++count;
visited[x][y] = 1;
int dx[4] = { -1, 0, 1, 0 }, dy[4] = { 0, 1, 0, -1 };
for (int q = 0; q<4; ++q){
int i = x + dx[q], j = y + dy[q];
dfs(visited, i, j, m, n, k);
}
/*dfs(visited, x + 1, y, m, n, k);
dfs(visited, x, y + 1, m, n, k);
dfs(visited, x - 1, y, m, n, k);
dfs(visited, x, y - 1, m, n, k);*/
}
};
/*
时间复杂度 O(MN) : 最差情况下,机器人遍历矩阵所有单元格,此时时间复杂度为 O(MN) 。
空间复杂度 O(MN) : 最差情况下,visited 内存储矩阵所有单元格的索引,使用 O(MN) 的额外空间。
*/
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有