剑指 Offer 13. 机器人的运动范围【DFS】

题目描述

地上有一个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

解题思路

本题思路和剑指offer 12.矩阵的路径是一样的,采用深度优先搜索策略。

只是在剪枝判断过程时,增加结点的数位之后是否小于K(18)。其他思路大致相同。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static class Solution13 {
public int movingCount(int m, int n, int k) {
if (m == 0 || n == 0) {
return 0;
}
boolean[][] visited = new boolean[m][n];
int count = dfs(m, n, k, 0, 0, visited);
return count;
}

private int dfs(int m, int n, int k, int indexI, int indexJ, boolean[][] visited) {
int count=0;
if(indexI>=0&&indexI<m&&indexJ>=0&&indexJ<n&&!visited[indexI][indexJ]&&getSum(indexI)+getSum(indexJ)<=k){//indexI、indexJ一定是 >=0的,剪枝。
visited[indexI][indexJ]=true;
count=1+dfs(m,n,k,indexI+1,indexJ,visited)+dfs(m,n,k,indexI,indexJ+1,visited);
}
return count;
}

private int getSum(int n) {
int sum=0;
while(n!=0){
sum+=n%10;
n=n/10;
}
return sum;
}
}

复杂度分析

时间复杂度:O(MN)

空间复杂度:O(MN)

资源

https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof

剑指 Offer 13. 机器人的运动范围【DFS】

http://example.com/2021/04/10/13 机器人的运动范围/

Author

John Doe

Posted on

2021-04-10

Updated on

2021-06-08

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.