Update 13. 机器人的运动范围.md

补充机器人可达范围配图与连通性分析,调整 DFS 遍历与回溯机制的说明。补充力扣对应题目的规则说明,并更新代码初始化。
This commit is contained in:
CyC2018
2026-10-30 20:17:59 +08:00
parent 9624889194
commit af4df3331e
2 changed files with 10 additions and 1 deletions
+10 -1
View File
@@ -10,7 +10,15 @@
## 解题思路
使用深度优先搜索(Depth First Search,DFS)方法进行求解。回溯是深度优先搜索的一种特例,它在一次搜索过程中需要设置一些本次搜索过程的局部状态,并在本次搜索结束之后清除状态。而普通的深度优先搜索并不需要使用这些局部状态,虽然还是有可能设置一些全局状态。
需要注意的是,答案不是“数位和不大于 k 的格子数”。机器人只能一格一格地走,满足条件的格子如果被不满足条件的格子隔开,就到不了。例如 m = n = 20、k = 5 时,满足条件的格子有 61 个,能到达的只有 21 个:
<div align="center"> <img src="pics/offer13-robot-reach.png" width="468px"/> </div><br>
因此要从 (0, 0) 出发搜索,只统计能走到的格子。使用深度优先搜索(Depth First Search,DFS):进入一个格子时先标记,避免重复计数;数位和超过 k 的格子不计数,也不再从它往外走。每个格子最多访问一次,时间复杂度 O(MN)。
回溯是深度优先搜索的一种特例,它在一次搜索过程中需要设置一些本次搜索过程的局部状态,并在本次搜索结束之后清除状态。本题的标记是全局的,走到过的格子不需要再走,所以搜索结束后不清除标记,这一点和[矩阵中的路径](12.%20矩阵中的路径.md)不同。
力扣上对应的 LCR 130 只允许向右和向下移动。按本题的数位和规则,在它的数据范围(m、n ≤ 100,k ≤ 20)内,两种走法能到达的格子相同,下面的代码同样适用。
```java
private static final int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
@@ -24,6 +32,7 @@ public int wardrobeFinishing(int m, int n, int cnt) {
this.rows = m;
this.cols = n;
this.threshold = cnt;
this.res = 0;
initDigitSum();
boolean[][] marked = new boolean[rows][cols];
dfs(marked, 0, 0);
Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB