使用堆和队列数据结构解决迷宫问题

python实现迷宫问题的栈和队列的解决方法:

#迷宫问题#表示迷宫的颜色,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]]

d=[    lambda x,y:(x+1,y),    lambda x,y:(x-1,y),    lambda x,y:(x,y+1),    lambda x,y:(x,y-1)    ]

#方法1:使用栈来进行解决,方法是回溯法,即深度优先搜索,但是并非是最佳最短的路线def maze_path(x1,y1,x2,y2):    stack=[]    stack.append((x1,y1))    while(len(stack)>0):        curnode=stack[-1]        if curnode[0]==x2 and curnode[1]==y2:            for path in stack:                print(path)            return True        for i in d:            nextnode=i(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 Falsemaze_path(1,1,8,8)

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:使用队列来进行记录,属于广度优先搜索from collections import deque  #导入队列的内置模块#输出路径函数def print_r(path):    real_path=[]    i=len(path)-1    while i>=0:        real_path.append(path[i][0:2])        i=path[i][2]    real_path.reverse()    for p in real_path:        print(p)

def maze_path1(x1,y1,x2,y2):    quede=deque()    path=[]    quede.append((x1,y1,-1))    while len(quede)>0:        curnode=quede.popleft()        path.append(curnode)        if curnode[0]==x2 and curnode[1]==y2:            #到达终点            print_r(path)        for dir in d:            nextnode=dir(curnode[0],curnode[1])            if maze[nextnode[0]][nextnode[1]]==0:                quede.append((nextnode[0],nextnode[1],len(path)-1))                maze[nextnode[0]][nextnode[1]] =2 #标记已经走过    return False

maze_path1(1,1,8,8)

原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/12433325.html

时间: 2024-11-05 13:38:36

使用堆和队列数据结构解决迷宫问题的相关文章

数据结构例程——迷宫问题(用队列)

本文针对数据结构基础系列网络课程(3):栈和队列中第11课时队列的应用-迷宫问题. 例:求出从入口到出口的路径 代码: #include <stdio.h> #define MaxSize 100 #define M 8 #define N 8 int mg[M+2][N+2]= { {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

C语言 解决迷宫问题练习

利用C语言来解决类似迷宫的问题,下面例子分别用两种方法来解决! [Problem] There is a maze as shown in the diagram below. In the maze in the form of a 100*100 matrix, the white background represents the road while the yellow background represents the wall. Assuming the upper left co

前端进击的巨人(二):栈、堆、队列、内存空间

面试经常遇到的深浅拷贝,事件轮询,函数调用栈,闭包等容易出错的题目,究其原因,都是跟JavaScript基础知识不牢固有关,下层地基没打好,上层就是豆腐渣工程,新人小白,踏实踩土才是关键. 打地基第二篇:本篇我们将对JavaScript数据结构的知识点详解一二. JavaScript中有三种数据结构: 栈(stack) .堆(heap). 队列(queue). 栈(stack) 栈的特点是"LIFO,即后进先出(Last in, first out)".数据存储时只能从顶部逐个存入,取

栈和队列数据结构博客园

1.本周学习总结(0--1分) 谈谈你对栈和队列结构的认识及学习体会. 体会:本章学习了栈和队列,堆栈和队列都是特殊的线性表,其数据元素以及数据元素之间的逻辑关系完全相同, 区别在于:线性表的插入和删除操作不受限制,堆栈只能在栈顶插入和删除,队列只能在队尾插入,在队头删除. 栈的特点还是非常有意思的,对于解决迷宫问题时有很好的 作用,栈的结构能保证迷宫问题中指针神时候进 去什么时候出来,通过保存从入口到当前位置的路径上走过的方块,可以保证所有位置可以原路返回.总之, 对于栈和队列的知识的初步了解

用LinkedList模拟一个堆栈或者队列数据结构 总结: LinkedList知识点

/** 用LinkedList模拟一个堆栈或者队列数据结构. 创建一个堆栈和队列数据结构对象,该对象中使用LinkedList来完成的. 知识点总结: 1.LinkedList特点:链表式数据结构. 重复有序,查询速度慢,增删速度快.不同步的. 2.LinkedList除了实现List接口增删改查的功能外,有一些特有的方法,能够实现在List(列表)的开头和结尾 插入,删除,获取等特有功能.这就是为什么LinkedList能够模拟一个堆栈,或者队列,双端队列的数据结构了. 涉及知识点: 1.什么

使用LinkedList模拟一个堆栈或者队列数据结构

使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出  如同一个杯子. 队列:先进先出  如同一个水管. import java.util.LinkedList; public class DuiLie { private LinkedList link; public DuiLie() { link = new LinkedList(); } public void myAdd(Object obj) { link.addFirst(obj); } public Object

java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。

/* 使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 First in First out FIFO 如同一个水管. */ import java.util.*; class DuiLie { private LinkedList link; DuiLie() { link = new LinkedList(); } public void myAdd(Object obj) { link.addFirst(obj); } public O

Java LinkedList特有方法程序小解 &amp;&amp; 使用LinkedList 模拟一个堆栈或者队列数据结构。

package Collection; import java.util.LinkedList; /* LinkedList:特有的方法 addFirst()/addLast(); getFirst()/getLast(); removeFirst()/removeLast(); 若链表为空,抛出 没有这个元素异常/NoSuchElementException 但是 JDK1.6 版本以后出现了替代方法: offerFirst()/offerLast(); peekFirst()/peekLas

Java使用LinkedList模拟一个堆栈或者队列数据结构

用Java模拟一个堆栈或者队列数据结构. 首先得明白堆栈和队列的数据结构: 堆栈:先进后出 队列:先进先出 LinkedList中刚好有addFirst()和addLast()方法. [java] view plaincopyprint? public class Stack { public static void main(String[] args) { StackTools tools = new StackTools(); tools.add("a"); tools.add(