给定一个二维列表,表示迷宫的轮廓(0表示通道,1表示墙),用栈结构完成算法,求一条走出迷宫的路径。 

实现思路:回溯法,从一个点开始,任意找一个能走的点,当找到不能走的点时,退回上一个点寻找是否有其他方向的点。 

代码示例

maze = [
    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 0, 1, 1, 0, 0, 0, 1, 0, 1],
    [1, 0, 1, 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, 0, 0],
]

# 定义方向匿名函数
dirs = [
    lambda x, y: (x + 1, y),  # 右
    lambda x, y: (x, y + 1),  # 下
    lambda x, y: (x - 1, y),  # 左
    lambda x, y: (x, y - 1),  # 上
]

def search_path(x1, y1, x2, y2):
    # 用列表模拟栈结构,只用append和pop操作
    stack = []
    # 压入起始位置
    stack.append((x1, y1))
    # 栈空表示没有路
    while len(stack) > 0:
        # 取当前位置
        cur_x, cur_y = stack[-1]
        # 已经到达终点时停止
        if cur_x == x2 and cur_y == y2:
            return stack
        # 四个方向尝试
        for dir in dirs:
            # 获取下一个点
            next_x, next_y = dir(cur_x, cur_y)
            # 保证不出界
            if 0 <= next_x < len(maze[0]) and 0 <= next_y < len(maze):
                # 0表示能走通
                if maze[next_y][next_x] == 0:
                    # 往能走通的方向走一步
                    stack.append((next_x, next_y))
                    # 记录已经走过,防止重复
                    maze[next_y][next_x] = 2
                    break
        else:  # 四个方向都走不通,死路,回退
            stack.pop()
            # 设置已经尝试过了,走不通
            maze[cur_y][cur_x] = 3
    else:
        return None

path = search_path(0, 0, 9, 9)
print(path)

本文为 陈华 原创,欢迎转载,但请注明出处:http://www.ichenhua.cn/read/305