使用图的深度优先遍历解决迷宫问题(思路讲解+完整代码)

迷宫问题是一种经典的图搜索问题,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)等图的遍历算法来解决。下面我会以深度优先的搜索方式进行基本展示;

1. 定义迷宫

首先,我们可以定义一个二维数组来表示迷宫,其中‘ . ’表示可以通过的路径,‘#’表示墙壁,S表示起点(标红),E表示终点(标蓝)。

maze = [
    ['#', '#', '#', '#', '#', '#', '#', '#'],
    ['#', 'S', ' ', ' ', ' ', ' ', 'E', '#'],
    ['#', ' ', '#', '#', ' ', '#', ' ', '#'],
    ['#', ' ', '#', ' ', ' ', '#', ' ', '#'],
    ['#', ' ', '#', '#', '#', '#', ' ', '#'],
    ['#', ' ', ' ', ' ', ' ', ' ', ' ', '#'],
    ['#', '#', '#', '#', '#', '#', '#', '#']
]

2. 深度优先搜索(DFS)

使用Python代码示例如下:

def solve_maze(maze, start, end):
    def dfs(x, y, path):
        if x < 0 or x >= len(maze) or y < 0 or y >= len(maze[0]) or maze[x][y] == '#':
            return False

#函数首先检查当前位置是否越界或者是否是障碍物。如果满足这些条件之一,说明当前位置不可走,返回False。否则,继续探索其他可能的路径
        if (x, y) in path:
            return False

#检查当前位置(由坐标(x, y)表示)是否已经在路径列表path中。如果已经存在,说明这个位置已经被访问过,为了避免重复访问和无限循环,返回False
        path.append((x, y))

#如果当前位置不在路径中,将其添加到路径列表中,表示已经访问过这个位置
        if (x, y) == end:
            return True

#检查当前位置是否是终点。如果是,返回True,表示找到了一条从起点到终点的路径
        if dfs(x + 1, y, path) or dfs(x - 1, y, path) or dfs(x, y + 1, path) or dfs(x, y - 1, path):
            return True

#向四个方向(上、下、左、右)递归地进行深度优先搜索。如果任何一个方向的搜索返回True,说明找到了一条从起点到终点的路径,因此当前位置也返回True
        path.pop()

#如果没有找到有效路径,需要回溯到上一个位置。这里使用pop()方法将当前位置从路径列表中移除,以便在后续的搜索中不会重复访问这个位置
        return False

#如果所有方向都没有找到有效路径,返回False,表示当前位置无法到达终点

    path = []

#初始化一个空列表,用于存储从起点到终点的路径
    if dfs(start[0], start[1], path):

#调用名为dfs的函数,传入起点坐标start[0]start[1]以及路径列表path。如果dfs函数返回True,表示找到了一条从起点到终点的路径
        return path

#如果找到了路径,返回路径列表
    else:
        return None

#返回None,表示没有找到从起点到终点的路径

# 迷宫示例如下:(S表示起点,E表示终点)
maze = [
    ['#', '#', '#', '#', '#', '#', '#', '#'],
    ['#', 'S', ' ', ' ', ' ', ' ', 'E', '#'],
    ['#', ' ', '#', '#', ' ', '#', ' ', '#'],
    ['#', ' ', '#', ' ', ' ', '#', ' ', '#'],
    ['#', ' ', '#', '#', '#', '#', ' ', '#'],
    ['#', ' ', ' ', ' ', ' ', ' ', ' ', '#'],
    ['#', '#', '#', '#', '#', '#', '#', '#']
]
start = (1, 1)
end = (1, 6)
print(solve_maze(maze, start, end))

运行结果是:

[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (4, 6), (3, 6), (2, 6), (1, 6)]

*注意:如果改变初值定位和终点定位那么路线也会随之改变,如果不存在则会返回None。

总结:

无论是深度优先搜索还是广度优先搜索,都可以有效地解决迷宫问题。选择哪种方法取决于具体需求和场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值