数据结构——python解决迷宫问题(深度优先和广度优先)

文章目录

迷宫问题

栈解决------深度优先------回溯法

python 复制代码
""""""
"""
规定每次按照某种的方式前进
每次前进都将节点的位置存入栈,这样栈中就存放着走过的路线
当不能再继续前进时:后退出栈,直到可以用另一条路可以前进
"""

maze = [
    [0, 1, 0, 0, 0],
    [0, 1, 0, 1, 0],
    [0, 0, 0, 1, 0],
    [0, 1, 1, 1, 0],
    [0, 0, 0, 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 solve(x1, y1, x2, y2):
    stack = []
    stack.append((x1, y1))
    while len(stack):
        current_node = stack[-1]
        if current_node[0] == x2 and current_node[1] == y2:
            for i in stack:
                print(i)
            return True

        for dir in dirs:
            next_node = dir(*current_node)
            if 0 <= next_node[0] < len(maze) and 0 <= next_node[1] < len(maze[0]):
                if maze[next_node[0]][next_node[1]] == 0:
                    stack.append(next_node)
                    maze[next_node[0]][next_node[1]] = 2
                    break
        else:
            maze[next_node[0]][next_node[1]] = 2
            stack.pop()
    else:
        print('没有通路')
        return False


solve(0, 0, 4, 4)

队列解决------广度优先

python 复制代码
""""""
"""
思想:
多条路径同时前进,第一个到达的就是最短路径
通过记录每个节点的上一个节点的位置实现
实现:
一个列表记录此时到达的全部位置(多条路线同时进行就有多个位置),再一个列表所有已经到过的节点位置以及每个节点的上一个位置
"""

from collections import deque

maze = [
    [0, 1, 0, 0, 0],
    [0, 1, 0, 1, 0],
    [0, 0, 0, 1, 0],
    [0, 1, 1, 1, 0],
    [0, 0, 0, 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 print_r(path):
    real_path = []
    real_item_index = len(path) - 1  # real_item:通路上的元素(最开始一定是path的最后一个元素)
    while real_item_index >= 0:
        real_path.append(path[real_item_index][0:2])
        real_item_index = path[real_item_index][2]
    real_path.reverse()
    for node in real_path:
        print(node)


def solve(x1, y1, x2, y2):
    q = deque()
    path = []
    q.append((x1, y1, -1))
    while len(q) > 0:
        current_node = q.popleft()
        path.append(current_node)

        if current_node[0] == x2 and current_node[1] == y2:
            # 到达终点,通过path逐层向前找到完整路径
            print_r(path)
            return True

        for dir in dirs:
            next_node = dir(current_node[0], current_node[1])
            if 0 <= next_node[0] < len(maze) and 0 <= next_node[1] < len(maze[0]):
                if maze[next_node[0]][next_node[1]] == 0:
                    q.append((next_node[0], next_node[1], len(path) - 1))
                    maze[next_node[0]][next_node[1]] = 2
    else:
        print('未找到通路')
        return False


solve(0, 0, 4, 4)

若有错误与不足请指出,关注DPT一起进步吧!!!

相关推荐
世洋Blog3 分钟前
算法导论-分治法和合并(Merge)排序
算法
柠檬叶子C7 分钟前
【Python】解决 No module named ‘imp‘ 问题 | Python3 中废弃的 imp 模块
开发语言·python
源代码•宸8 分钟前
Golang基础语法(go语言结构体、go语言数组与切片、go语言条件句、go语言循环)
开发语言·经验分享·后端·算法·golang·go
我想吃烤肉肉8 分钟前
wait_until=“domcontentloaded“ 解释
开发语言·前端·javascript·爬虫·python
weixin1997010801611 分钟前
废旧物资 item_search - 按关键字搜索商品列表接口对接全攻略:从入门到精通
数据库·python
海棠AI实验室12 分钟前
第二章 从脚本到工程:进阶学习的 5 个方法论(可维护性/可复现/可评估/可扩展/可交付)
python·数据
l1t14 分钟前
快速加载CSV文件到数据库的工具pg_csv_loader
数据库·算法
学习3人组21 分钟前
CentOS 系统下 ModelScope 模型下载的默认目录
linux·python·centos
yugi98783822 分钟前
基于Matlab的晴空指数计算实现
开发语言·算法·matlab
song1502653729825 分钟前
空间站太阳能帆板电池 组件性能测试 AM0太阳光模拟器
开发语言·python