Я написал код Python, чтобы помочь мне понять, как решить лабиринт с помощью стека и не рекурсии.
то, что я придумал для работы SEEMS (как в целевой позиции в 2d массиве, представляющем лабиринт, достигнуто несколько версий лабиринта). Представление, если 1
для стены, 0
для пробела, 2
для цели и 3
для "посещенных".
Тем не менее, я подозрительный и хотел бы, чтобы кто-то подтвердил правильность логики или, если не то, что мне нужно сделать, чтобы исправить это.
Моя главная проблема заключается в том, что координаты возвращаются в стек даже когда они были посещены.
Пожалуйста, поймите, что у меня ситуация с курицей и яйцом - я не совсем понимаю, как работает алгоритм, поэтому я написал код, который поможет мне понять, но я не уверен, правильный ли код, отчасти зависит от понимания алгоритм...
Как всегда, любая помощь очень ценится. Код ниже:
class Stack:
def __init__(self):
self.list = []
def push(self, item):
self.list.append(item)
def pop(self):
return self.list.pop()
def top(self):
return self.list[0]
def isEmpty(self):
return not self.list
def empty(self):
self.list = []
maze = [[0, 0, 1, 1],
[0, 1, 0, 1],
[0, 0, 1, 1],
[0, 0, 2, 0]]
MAZE_SIZE = len(maze)
def print_maze(maze):
for row in maze:
print((row))
def is_valid_pos(tup):
(col, row) = tup
if col < 0 or row < 0 or col >= MAZE_SIZE or row >= MAZE_SIZE :
return False
return maze[row][col] == 0 or maze[row][col] == 2
def solve(maze, start):
s = Stack()
(col,row) = start
print('pushing ({},{})'.format(col,row))
s.push((col,row))
while not s.isEmpty():
print('Stack contents: {}'.format(s.list))
input('Press Enter to continue: ')
print('Popping stack')
(col, row) = s.pop()
print('Current position: ({}, {})'.format(col,row))
if maze[row][col] == 2:
print('Goal reached at ({}, {})'.format(col,row))
return
if maze[row][col] == 0:
print('Marking ({}, {})'.format(col,row))
maze[row][col] = 3
print_maze(maze)
print('Pushing coordinates of valid positions in 4 directions onto stack.')
if is_valid_pos((col+1, row)): s.push((col+1, row))
if is_valid_pos((col, row+1)): s.push((col, row+1))
if is_valid_pos((row, col-1)): s.push((row, col-1))
if is_valid_pos((row-1, col)): s.push((row, col))
solve(maze, (0,0))
Поскольку в вашей системе координат столбцы всегда идут до строк, вы должны изменить:
if is_valid_pos((row, col-1)): s.push((row, col-1))
if is_valid_pos((row-1, col)): s.push((row, col))
чтобы:
if is_valid_pos((col-1, row)): s.push((col-1, row))
if is_valid_pos((col, row-1)): s.push((col, row-1))
и ваш код будет работать.