好的,我们来详细讨论一下 LeetCode 上的第 489 题:Robot Room Cleaner。
题目描述
这道题要求我们模拟一个机器人在一个未知的房间内进行清洁的过程。房间的布局是未知的,机器人只能通过有限的方向移动(通常是上、下、左、右),并且机器人不能回到已经清洁过的位置。
机器人有一个 clean
方法用来清洁当前位置,以及一个 move
方法用来移动到下一个位置。如果移动失败(比如遇到了墙壁),move
方法会返回 false
。机器人还有一个 turnLeft
和 turnRight
方法用来改变方向。
解题思路
这道题可以使用深度优先搜索(DFS)来解决这个问题。关键点在于如何避免重复访问已经清洁过的位置,以及如何确保机器人能够回到出发点。
- 方向控制:定义一个方向数组,比如
[(0, 1), (1, 0), (0, -1), (-1, 0)]
,分别代表上、右、下、左四个方向。 - 状态记录:使用一个集合来记录已经清洁过的位置。
- 回溯:在每次移动到一个新位置后,进行清洁,并递归地探索其他方向。探索完所有方向后,需要回到上一个位置。
代码实现
以下是一个 Python 示例代码,假设机器人类已经定义好了 clean
, move
, turnLeft
, turnRight
方法。
class Solution:
def cleanRoom(self, robot):
def go_back():
robot.turnRight()
robot.turnRight()
robot.move()
robot.turnRight()
robot.turnRight()
def dfs(x, y, d):
robot.clean()
visited.add((x, y))
for i in range(4):
new_d = (d + i) % 4
new_x, new_y = x + directions[new_d][0], y + directions[new_d][1]
if (new_x, new_y) not in visited and robot.move():
dfs(new_x, new_y, new_d)
go_back()
robot.turnRight()
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
visited = set()
dfs(0, 0, 0)
假设机器人类如下:
class Robot: def clean(self): pass
def move(self):
pass
def turnLeft(self):
pass
def turnRight(self):
pass
详细解释
- go_back 函数:这个函数用于让机器人回到上一个位置。具体操作是先转180度,然后移动一步,再转回原来的方向。
- dfs 函数:这是一个深度优先搜索函数,参数
(x, y, d)
分别表示当前的位置和方向。- 首先清洁当前位置,并将当前位置加入
visited
集合。 - 然后尝试四个方向(通过循环和方向数组
directions
实现)。 - 如果新位置没有被访问过且可以移动,递归调用
dfs
。 - 每次尝试新方向前,先右转,以便下一次循环时尝试下一个方向。
- 首先清洁当前位置,并将当前位置加入
- 主函数:初始化方向数组和访问集合,从
(0, 0, 0)
(即起始位置和向上方向)开始进行深度优先搜索。
注意事项
- 机器人类的具体实现细节(如
clean
,move
,turnLeft
,turnRight
方法)需要根据题目提供的接口来调整。 - 这道题的关键在于理解和实现回溯过程,确保机器人能够回到出发点。
希望这个详细的解答能帮助你理解并解决这道题目。如果有更多问题,欢迎继续提问!
发表回复