扫地机器人
难度:
标签:
题目描述
代码结果
运行时间: 39 ms, 内存: 16.9 MB
/*
* 思路:
* 1. 扫地机器人可以在一个网格中移动,并且可以向上、向下、向左、向右移动。
* 2. 我们使用Java Stream API来处理机器人移动和清洁逻辑。
* 3. 使用递归和Stream的组合来进行深度优先搜索(DFS)。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
private static final int[][] DIRECTIONS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public void cleanRoom(Robot robot) {
Set<String> visited = new HashSet<>();
dfs(robot, 0, 0, 0, visited);
}
private void dfs(Robot robot, int row, int col, int d, Set<String> visited) {
String position = row + "," + col;
if (visited.contains(position)) {
return;
}
visited.add(position);
robot.clean();
IntStream.range(0, 4).forEach(i -> {
int newD = (d + i) % 4;
int newRow = row + DIRECTIONS[newD][0];
int newCol = col + DIRECTIONS[newD][1];
if (robot.move()) {
dfs(robot, newRow, newCol, newD, visited);
robot.turnRight();
robot.turnRight();
robot.move();
robot.turnRight();
robot.turnRight();
}
robot.turnRight();
});
}
}
解释
方法:
这个题解使用深度优先搜索 (DFS) 的方式来遍历并清扫房间。机器人从初始位置 (0, 0) 开始,朝向初始方向。在每个位置,机器人先清扫当前格子,然后依次尝试向右转并前进到下一个格子,重复 DFS 过程。如果四个方向都无法前进(可能是因为已经清扫过或者被障碍物阻挡),则返回上一个位置。通过递归的方式,机器人能够遍历整个房间的所有可达格子。
时间复杂度:
O(m * n)
空间复杂度:
O(m * n)
代码细节讲解
🦆
在题解中提到的DFS算法中,如何判断'四个方向都无法前进'的具体条件?
▷🦆
题解提到使用递归的方式实现DFS,这种实现方式是否可能导致栈溢出,尤其是在非常大的房间中?
▷🦆
题解中提到'对于每个可达的格子,机器人需要访问一次',那么在算法中如何确保不会重复清扫同一个格子?
▷🦆
在题解的递归函数dfs中,每次机器人向右转并尝试新的方向后,是否需要再次验证该方向是否可前进?
▷