博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构(python) —— 【22: 用栈解决迷宫问题】
阅读量:3942 次
发布时间:2019-05-24

本文共 1941 字,大约阅读时间需要 6 分钟。

用栈解决迷宫问题

1. 问题

迷宫问题:

给一个二维列表,表示迷宫(0表示通道,1表示围墙)
给出算法,求一条走出迷宫的路径。

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]]

迷宫

2. 解决思路

栈——深度优先搜索(回溯法)

思路: 从一个节点开始,任意找下一个能走的点,当找不到能走的点时,退回上一个点寻找是否有其他方向的点
使用栈存储当前路径

3. 代码

'''TOPIC: 用栈解决迷宫问题author: Bluetime: 2020-08-12QQ: 2458682080'''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]]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 maze_path(x1, y1, x2, y2):    stack = []    stack.append((x1, y1))    while(len(stack) > 0):   # 栈空表示没有路        current_node = stack[-1]  # 当前节点        # 判断当前是否走到了终点        if current_node[0] == x2 and current_node[1] == y2:            # 把路径打印出来            for p in stack:                print(p)            return True        # x, y四个方向: x, y-1; x+1, y; x, y+1; x-1, y        for dir in dirs:            next_node = dir(current_node[0], current_node[1])            # 如果下一个节点能走            if maze[next_node[0]][next_node[1]] == 0:                stack.append(next_node)                maze[next_node[0]][next_node[1]] = 2  # 表示已经走过                break        else:  # 如果4个位置都不能走了,该点就出栈            maze[current_node[0]][current_node[1]] = 2            stack.pop()    else:        print("无路可走,走投无路")        return Falsemaze_path(1, 1, 8, 8)

结果:

(1, 1)(2, 1)(3, 1)(4, 1)(5, 1)(5, 2)(5, 3)(6, 3)(6, 4)(6, 5)(7, 5)(8, 5)(8, 6)(8, 7)(8, 8)

路线为:

路线

转载地址:http://jbiwi.baihongyu.com/

你可能感兴趣的文章
linux下C代码、C++代码和命令行方式,完成字符集编码的转换
查看>>
写代码就像写作文
查看>>
常用shell特殊符号变量一览
查看>>
如何做事
查看>>
架构实践 - 1. 架构风格
查看>>
架构实践 - 3. 基于事件系统的demo
查看>>
架构实践 - 4. 架构设计之进程通信(独立构件风格)
查看>>
架构实践 - 5. 基于进程通信的demo
查看>>
sys/time.h 和 time.h的区别
查看>>
1、蓝牙概述
查看>>
2 系统架构师 - 知识框架
查看>>
Linux下 socket-tcp通信
查看>>
小米笔记本解决风扇异响
查看>>
Linux下 socket-udp通信
查看>>
Linux - 守护进程-1
查看>>
syslog 和 rsyslog
查看>>
Linux下,write/read,recv/send, recvfrom/sendto的区别
查看>>
ubuntu下 rc.local的脚本不运行
查看>>
Linux下简单Makefile文件的编写
查看>>
linux下配置JDK JAVA环境
查看>>