python带我们走迷宫

    当拿到如下迷宫地图时,给定入口和出口,怎么找到出去的路径呢?这么找到最快的路径呢?python就可以实现这个小功能哦~

在整个计算开始时,把迷宫的人口(序对)作为检查的当前位置,算法过程就是:

  • mark当前位置。

  • 检查当前位置是否为出口,如果是则成功结束。

  • 逐个检查当前位置的四邻是否可以通达出口。

  • 如果对四邻的探索都失败,报告失败。

方法一、找到出去的路

maze = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1],
        [1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1],
        [1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1],
        [1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1],
        [1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
        [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
        [1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1],
        [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1],
        [1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1],
        [1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
def maze_path_stack(x1, y1, x2, y2):
    """
    用栈求解迷宫问题——深度优先搜索算法
    :param x1: 起点x位置
    :param y1: 起点y位置
    :param x2: 终点x位置
    :param y2: 终点y位置
    :return:
    """
    dirs = [
            lambda x, y: (x+1, y),  # 当前位置上面
            lambda x, y: (x-1, y),  # 当前位置下面
            lambda x, y: (x, y-1),  # 当前位置左面
            lambda x, y: (x, y+1)   # 当前位置右面
    ]
    stack = []  # 定义一个栈,用来存放路径
    stack.append((x1, y1))  # 把当前位置压栈
    while len(stack) > 0:  # 只要栈不空就一直找路
        curNode = stack[-1]  # 当前的节点
        if curNode[0] == x2 and curNode[1] == y2:
            print("找到路了.")
            for i in stack:
                print(i)
            return True
        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_stack(1, 1, 10, 12)


方法二、找到最近的出路

from collections import deque
def print_path(path):
    curNode = path[-1]  # 迷宫的终点
    realPath = []  # 存储真实的路径
    while curNode[2] != -1:  # 只要没有到达开始位置就继续往真实路径中添加
       realPath.append(curNode[0:2])
       curNode = path[curNode[2]]
    realPath.append(curNode[0:2])  # 路径的倒序
    realPath.reverse()
    for node in realPath:
        print(node)
def maze_path_queue(x1, y1, x2, y2):
    """
    用队列求解迷宫问题——广度优先搜索算法
    :param x1: 起点x位置
    :param y1: 起点y位置
    :param x2: 终点x位置
    :param y2: 终点y位置
    :return:
    """
    dirs = [
            lambda x, y: (x+1, y),  # 当前位置上面
            lambda x, y: (x-1, y),  # 当前位置下面
            lambda x, y: (x, y-1),  # 当前位置左面
            lambda x, y: (x, y+1)   # 当前位置右面
    ]
    queue = deque()  # 队列中存放的是当前正在考虑的节点位置
    queue.append((x1, y1, -1))   # x的位置,y的位置,该(x,y)位置是由哪个位置走过来的
    path = []
    while len(queue) > 0:  # 之后当前考虑的节点还有,就证明还可以走,当queue为空,证明没有往下走的路了
        curNode = queue.popleft()
        path.append(curNode)
        if curNode[0] == x2 and curNode[1] == y2:
            print("找到路了")
            print_path(path)
            return True
        for dir in dirs:
            nextNode = dir(curNode[0], curNode[1])
            if maze[nextNode[0]][nextNode[1]] == 0:
                queue.append((nextNode[0], nextNode[1], len(path)-1))  # 后续节点进队,记录哪个节点带他来的
                maze[nextNode[0]][nextNode[1]] = 2  # 2表示已经走过的节点
    else:
        print("没有路。")
        return False
maze_path_queue(1, 1, 10, 12)

S是入口位置 ,E是出口位置,*代表找到的路径,#代表探索过的路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值