算法剑指 Offer 13.机器人的运动范围
Posted Rose J
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法剑指 Offer 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
2.思路
参考博客:https://blog.csdn.net/YouMing_Li/article/details/114270397
解题思路
1.深度优先搜索(dfs)
通过判断该坐标是否越界、该坐标是否访问过、该坐标数位之和是否大于k来判断机器人能否进入该格子,不管能否进入,都将该格子标记为已访问,且退出当前调用栈后,不用回退标记数组的状态,因为本身就是要访问完所有能够访问到的格子。如果机器人能够进入坐标为(x,y)的格子,而后再判断机器人能否进入该坐标相邻的4个格子,直到所有能遍历到的格子都遍历结束。
3.答案
class Solution
private int count = 0;
public int movingCount(int m, int n, int k)
if (m < 0 || n < 0) return -1;
boolean[][] isVisited = new boolean[m][n];
dfs(m, n, isVisited, 0, 0, k);
return count;
private void dfs(int m, int n, boolean[][] isVisited, int x, int y, int k)
if (x >= m || x < 0 || y >= n || y < 0 || isVisited[x][y]) return;
isVisited[x][y] = true;
if (getSum(x, y) <= k)
count++;
int[] dx = -1, 1, 0, 0;
int[] dy = 0, 0, -1, 1;
for (int i = 0; i < 4; i++)
int a = x + dx[i];
int b = y + dy[i];
dfs(m, n, isVisited, a, b, k);
else
return;
private int getSum(int x, int y)
int res = 0;
while (x > 0)
res += x % 10;
x /= 10;
while (y > 0)
res += y % 10;
y /= 10;
return res;
以上是关于算法剑指 Offer 13.机器人的运动范围的主要内容,如果未能解决你的问题,请参考以下文章