Решение лабиринта с использованием стека в Python - мой алгоритм верен?

1

Я написал код 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))
Теги:
algorithm
stack

1 ответ

2

Поскольку в вашей системе координат столбцы всегда идут до строк, вы должны изменить:

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))

и ваш код будет работать.

  • 1
    Хорошо, я исправил это, так что я надеюсь, что если я выполню код достаточно раз на достаточном количестве лабиринтов и буду следить за результатами, у меня будет момент "ах-ха" о том, как работает алгоритм. Что-нибудь, что вы можете добавить, чтобы облегчить это? Все еще кажется немного вуду в мо ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню