用栈解决迷宫问题

#  迷宫 0表示路径,1表示围墙,设计算法从起点走到终点,起点是左上角的0,终点是右下角的0
maze = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
    [1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
    [1, 0, 0, 0, 0, 1, 1, 0, 0, 1],
    [1, 0, 1, 1, 1, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
    [1, 0, 1, 0, 0, 0, 1, 0, 0, 1],
    [1, 0, 1, 1, 1, 0, 1, 1, 0, 1],
    [1, 1, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]

思路:从起点开始,任意找下一个能走的点,当找不到能走的点时;退回上一位置,再寻找另一个能走的点。

def maze_path(x1,y1,x2,y2):
    # 创建一个存放路径的栈
    stack = []
    # 首先存放起点
    stack.append((x1, y1))
    # 如果stack长度为0,说明退回到起点了,没有路;否则就一直找路
    while(len(stack)>0):
        curNode = stack[-1]  # 当前的节点就是栈存放的最后一个坐标
        if curNode[0] == x2 and curNode[1] == y2:
            # 走到终点了,将路径打印出来
            for p in stack:
                print(p)
            return True

        # x,y 四个方向 x-1,y; x+1,y; x,y-1; x,y+1
        for dir in dirs:
            nextNode = dir(curNode[0], curNode[1])
            # 如果下一个节点能走
            if maze[nextNode[0]][nextNode[1]] == 0:
                stack.append(nextNode)
                maze[nextNode[0]][nextNode[1]] = 2 # 将走过的位置标为2,表示为已经走过
                break
        else:
            maze[nextNode[0]][nextNode[1]] = 2
            stack.pop()
    else:
        print("没有路")
        return False

maze_path(1,1,8,8)

 

用栈解决迷宫问题

上一篇:重装Win8要做的事情


下一篇:WPF和Expression Blend开发实例:Loading动画