Given a robot cleaner in a room modeled as a grid.
Each cell in the grid can be empty or blocked.
The robot cleaner with 4 given APIs can move forward, turn left or turn right. Each turn it made is 90 degrees.
When it tries to move into a blocked cell, its bumper sensor detects the obstacle and it stays on the current cell.
Design an algorithm to clean the entire room using only the 4 given APIs shown below.
interface Robot {
// returns true if next cell is open and robot moves into the cell.
// returns false if next cell is obstacle and robot stays on the current cell.
boolean move();
// Robot will stay on the same cell after calling turnLeft/turnRight.
// Each turn will be 90 degrees.
void turnLeft();
void turnRight();
// Clean the current cell.
void clean();
}
Example:
Input:
room = [
[1,1,1,1,1,0,1,1],
[1,1,1,1,1,0,1,1],
[1,0,1,1,1,1,1,1],
[0,0,0,1,0,0,0,0],
[1,1,1,1,1,1,1,1]
],
row = 1,
col = 3
Explanation:
All grids in the room are marked by either 0 or 1.
0 means the cell is blocked, while 1 means the cell is accessible.
The robot initially starts at the position of row=1, col=3.
From the top left corner, its position is one row below and three columns right.
Notes:
Solution:
class Solution(object): def cleanRoom(self, robot): """ :type robot: Robot :rtype: None """ directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] def backtrack(): robot.turnLeft() robot.turnLeft() robot.move() robot.turnRight() robot.turnRight() def dfs(location, d, visited): # 访问过 dfs结束 if location in visited: return visited.add(location) robot.clean() # 四个方向dfs遍历 for i in range(4): if robot.move(): dfs((location[0]+directions[d][0], location[1]+directions[d][1]), d, visited) # 相比常规DFS 多出了这一步手动回溯 backtrack() d = (i+1) % 4 robot.turnRight() dfs((0, 0), 0, set())
不是会员没有验证程序的正确性,算法上应该没错。本题和常规的DFS不同之处在于需要手动回溯(backtrack函数),Robot在变换方向和移动时需要调API,但是去掉了这个外壳,核心还是DFS遍历图。如果该坐标已在visited中表示递归结束。
LeetCode in Python 489. Robot Room Cleaner
原文:https://www.cnblogs.com/lowkeysingsing/p/11178765.html