Рассмотрим задачу, в которой «робот-уборщик» помещен в комнату, смоделированную в виде сетки. Каждая ячейка в сетке может быть пустой или заблокированной, и все доступные ячейки соединены, то есть все пустые ячейки будут доступны роботу независимо от его начальной позиции.
Нам говорят, что робот-уборщик может выполнить только одно из четырех действий:
robot.move()
для движения вперед (возвращает true, если следующая ячейка открыта, а робот перемещает в ячейку, возвращает false, если следующая ячейка является препятствием, и робот остается в текущей ячейке.) robot.turn_left()
для поворота влево (90 градусов, без движения) robot.turn_right()
для поворота вправо (90 градусов, без движения) robot.clean()
, чтобы очистить текущую ячейку в сетке
Нам предлагается разработать алгоритм для робота, чтобы очистить всю room .
Каждое решение, которое я нашел для этой проблемы, рассматривает исследование соседних ячеек (до ячейки, которую в настоящее время посещают) либо в по часовой стрелке , либо в против по часовой стрелке направление (т.е. так принцип следования за стеной светодиода) относительно текущего направления робота в ячейке (например, пример ниже в Python). Почему?
Например, почему бы не использовать обычную DFS (и, таким образом, выбор соседних ячеек в любом порядке (например, пробовать все 4 направления, например, вверх / вниз / вправо / влево независимо от текущая позиция ) здесь не работает?
def clean_room(robot):
def go_back():
robot.turn_right()
robot.turn_right()
robot.move()
robot.turn_right()
robot.turn_right()
def backtrack(cell = (0, 0), d = 0):
visited.add(cell)
robot.clean()
# Always going clockwise : 0: 'up', 1: 'right', 2: 'down', 3: 'left'
for i in range(4):
new_d = (d + i) % 4
new_cell = (cell[0] + directions[new_d][0], \
cell[1] + directions[new_d][1])
if not new_cell in visited and robot.move():
backtrack(new_cell, new_d)
go_back()
# turn the robot following chosen direction : clockwise
robot.turn_right()
# Going clockwise : 0: 'up', 1: 'right', 2: 'down', 3: 'left'
directions = [(-1, 0), (0, 1), (1, 0), (0, -1)]
visited = set()
backtrack()