迷宫老鼠求解算法(利用栈)

迷宫老鼠求解算法(利用栈)
迷宫老鼠求解算法(利用栈)

算法分析与设计 查找迷宫的最短路径(深度算法)

算法分析与设计 查找迷宫的最短路径(深度算法) 计算机科学与技术12级 16班 2012/12/16

【摘要】:迷宫求解是一个古老的游戏,要在迷宫中找到出口,需要经过一连串的错误尝试才能找到正确的路径,有的时候甚至找不到路径。类似于给定一个m*n的矩形网格,设其左上角为起点S。一辆汽车从起点出发驶向右下角终点T。在若干网格处设置了障碍,表示该网格不可到达。设计一个算法,求汽车从起点S出发到达终点T的一条路线。用计算机求解这个问题时,我们通常采用的是回溯方法,即从入口出发,顺某方向向前探索,若能走通,则继续往前走;否则沿原路退回。换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,在求迷宫通路的算法中应用“栈”也就是自然而然的事。当然还有其他的方法来解决,例如顺序表,深度优先遍历,广度优先遍历等。 【关键词】:最短路径; 时间复杂度;深度优先搜索 【Summary】Maze solving is an ancient game , you want to find the exit in the maze , need to go through a series of trial and error to find the right path , and sometimes not even find the path . A m * n rectangular grid , similar to a given set its upper-left corner as the starting point S . A car from the starting point towards the bottom right corner of the end of T . Set up barriers at certain grid , indicates that the grid is unreachable . Design an algorithm , find the car starting to reach the end point T, route from the starting point S . Use the computer to solve this problem , we usually use the backtracking method , that is, starting from the entrance , Shun forward to explore a direction , if we go through , and continue to move forward ; otherwise return along the same route . Continue to explore another direction , until all possible paths to explore to far . In order to ensure that in any position along the same route back , it is clear that the need to use a LIFO structure to save the path from the entrance to the current position . Therefore , in seeking labyrinth path algorithm application "stack" is the natural thing to do . Of course , there are other ways to solve , for example, the sequence table , depth-first traversal , breadth -first traversal . 【Key phrase】Shortest path ; time complexity ; deep-first search

利用栈实现迷宫地求解

利用栈实现迷宫的求解 一、要解决的问题: 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 二:算法基本思想描述: 用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的边界;第1行第1列元素和第m行第n列元素置成“0”,表示迷宫的入口和出口走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、南、西、北4个方向顺序试探下一个位置; 用二维数组move记录4个方向上行下标增量和列下标增量,则沿第i个方向前进一步,可能到达的新位置坐标可利用move数组确定: Px=x+move[i][0] Py=y+move[i][1] 如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索; 如果4个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。 三:设计: 1:数据结构的设计: (1)定义三元数组元素的结构 typedef struct MazeDirect { int Dx; //行标 int Dy; //列标 int direct; //走到下一个坐标点的方向 }MazeDirect; (2)定义链表节点的结构组成 typedef struct LinkNode { elemtype data; //数据域 struct LinkNode *next; //指针域 }LinkNode; (3)定义链栈的头指针 typedef struct {

课程设计_老鼠走迷宫

HUNAN CITY UNIVERSITY 数据结构课程设计报告 设计题目:老鼠走迷宫 专业:计算机科学与技术 学生姓名:邓宇 班级学号: 0906401-23 指导教师:杨格兰、胡奇光 2011 年 6 月 18 日

一、设计时间 2011年6月20日——24日 二、设计地点 湖南城市学院第一实验楼计算机系机房509 三、设计目的 1.培养实际工作所需要的动手能力,进一步熟悉基本概念; 2.熟练掌握对实际问题的抽象技能,了解程序基本的流程; 3.培养查阅资料,独立思考问题的能力。 四、设计人 邓宇 五、指导老师 杨格兰、胡奇光 六、设计课题 老鼠走迷宫 开发环境:Visual Studio 2010 Ultimate UML Activity Diagram Visual C # 2008 Express Editions Adobe Photoshop CS4 七、基本思路及关键问题的解决方法 技术要求: 程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。 要求: 1、老鼠形象可辨认,可用键盘操纵老鼠上下左右移动; 解决方案:老鼠图片形象可以用Photoshop来制作,通过键盘按键事件发送消息到对象(老鼠),实现老鼠的移动。 2、迷宫的墙足够结实,老鼠不能穿墙而过; 解决方案:在老鼠每一步的移动中检测是否撞墙,若是则停止走动。

由于地图是图片,要检测就需要取出墙壁那点的颜色(显然不是白色),然后作比较来作碰撞检测。 3、若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败; 解决方案:加载定时器,设定60秒钟,若在规定的时间,及时间变成0时,弹出对话框提示用户游戏失败。 4、添加编辑迷宫功能,可修改当前迷宫。 解决方案:备用一张地图图片资源,可以用于更换地图。 八、算法及流程图 Visio流程图:

实验四:A星算法求解迷宫问题实验

实验四:A*算法求解迷宫问题实验 一、实验目的 熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解迷宫问题,理解求解流程和搜索顺序。 二、实验内容 迷宫问题可以表述为:一个二维的网格,0表示点可走,1表示点不可以走,点用(x,y)表示,寻找从某一个给定的起始单元格出发,经由行相邻或列相邻的单元格(可以通过的),最终可以到达目标单元格的、所走过的单元格序列。在任一个单元格中,都只能看到与它邻近的4个单元格(如果位于底边,则只有3个;位于4个角上,则只有2个是否能通过)。 A*算法是人工智能中的一种搜索算法,是一种启发式搜索算法,它不需遍历所有节点,只是利用包含问题启发式信息的评价函数对节点进行排序,使搜索方向朝着最有可能找到目标并产生最优解的方向。它的独特之处是检查最短路径中每个可能的节点时引入了全局信息,对当前节点距终点的距离做出估计,并作为评价节点处于最短路线上的可能性的度量。 A*算法中引入了评估函数,评估函数为:f(n)=g(n)+h(n)其中:n是搜索中遇到的任意状态。g(n)是从起始状态到n的代价。h(n)是对n到目标状态代价的启发式估计。即评估函数f ( n) 是从初

始节点到达节点n 处已经付出的代价与节点n 到达目标节点的接近程度估价值的总和。 这里我们定义n点到目标点的最小实际距离为h(n)*,A*算法要满足的条件为:h(n)<=h(n)* 迷宫走的时候只能往上下左右走,每走一步,代价为1,这里我们采用的估价函数为当前节点到目标节点的曼哈顿距离,即:h(n)=|end.x –n.x|+ |end.y –n.y| 这里end表示迷宫的目标点,n表示当前点,很明显这里h(n)<=h(n)*。 g(n)容易表示,即每走一步的代价是1,所以利用f(n)=g(n)+h(n)这种策略,我们可以不断地逼近目标点,从而找到问题的解。 时间复杂度:m行n列的迷宫矩阵实现算法的时间复杂度为O(m*n). 实验结果:

利用栈实现迷宫的求解

利用栈实现迷宫的求解 一、要解决的四个问题: 1、表示迷宫的数据结构: 设迷宫为m行n列,利用maze[m][n]来表示一个迷宫,maze[i][j]=0或1; 其中:0表示通路,1表示不通,当从某点向下试探时,中间点有4个方向可以试探,(见图)而四个角点有2个方向,其它边缘点有3个方向,为使问题简单化我们用maze[m+2][n+2]来表示迷宫,而迷宫的四周的值全部为1。这样做使问题简单了,每个点的试探方向全部为4,不用再判断当前点的试探方向有几个,同时与迷宫周围是墙壁这一实际问题相一致。 如图3.4表示的迷宫是一个6×8的迷宫。入口坐标为(1,1),出口坐标为(m,n)。 入口(1,1) 图 1 用maze[m+2][n+2]表示的迷 宫 迷宫的定义如下: #define m 6 /* 迷宫的实际行 */ #define n 8 /* 迷宫的实际列 */ int maze [m+2][n+2] 2 、试探方向: 在上述表示迷宫的情况下,每个点有4个方向去试探,如当前点的坐标(x , y),与其相邻的4个点的坐标都可根据与该点的相邻方位而得到,如图2所示。因为出口在(m,n),因此试探顺序规定为:从当前位置向前试探的方向为从正东沿顺时针方向进行。为了简化问题,方便的求出新点的坐标,将从正东开始沿顺时针进行的这4个方向(用0,1,2,3表示东、南、西、北)的坐标增量放在一个结构数组move [ 4 ]中,在move 数组中,每个元 m n 素有两个域组成,x:横坐标增量,y:纵坐标增量。Move数组如图3所示。 move数组定义如下: typedef struct { int x //行 int y //列 } item item move[4] 这样对move的设计会很方便地求出从某点 (x,y) 按某一方向 v (0≤v≤3) 到达的新点(i,j)的坐标:i =x + move[v].x ,j = y + move[v].y 。 3.栈的设计: 当到达了某点而无路可走时需返回前一点,再从前一点开始向下一个方向继续试探。因此,压入栈中的不仅是顺序到达的各点的坐标,而且还要有从前一点到达本点的方向,即每走一步栈中记下的内容为(行,列,来的方向)。对于图1所示迷宫,依次入栈为: 栈中每一组数据是所到达的每点的坐标及从该点沿哪个方向向下走的,对于图3迷宫,走

电脑鼠走迷宫死区排除算法

电脑鼠走迷宫大赛探索过程算法优化研究 ——死路排除算法 ——死区域算法1摘要 电脑鼠走迷宫大赛是由国际电工和电子工程学会(IEEE)举办的人工智能领域的一项国际性赛事,集机械、电子、控制、光学、程序设计和人工智能等多方面科技知识于一体[1],具有很高的知名度。迷宫算法的优劣直接影响比赛的最终成绩。本文从经典迷宫算法入手,先后提出了能排除单行当列死路的“死路排除算法”和能够排除任意形状死区域的“渗透法”,然后通过测试验证两种改进算法的优越性。改进算法的核心思想是通过已经获得的迷宫信息排除不包含最短路径信息的死区域。同时,文中创造性的将“渗透思想”用于迷宫算法当中,很好的实现了死区域的判定与排除。与经典算法相比,改进算法在时间、空间方面都有良好的优化效果。 2背景简介 电脑鼠走迷宫大赛是国际电工和电子工程学会(IEEE)每年都会举办的一项国际性赛事,于1972年由美国机械杂志发起。比赛中的电脑鼠是一个小型的由微处理器控制的机器人车辆,在复杂迷宫中具有译码和导航功能。该比赛自推出以来,受到了世界各国师生的青睐。2007年和2008年,上海市计算机学会率先在中国主办了两次IEEE标准电脑鼠走迷宫邀请赛(长三角地区),有三十多所院校参加,反响强烈。2009年比赛范围扩展到全国,共有9个赛区的52所高校参赛[2]。 2.1电脑鼠走迷宫大赛规则[3] 电脑鼠的基本功能是从起点开始走到终点,这个过程称为一次“运行”,所花费的时间称为“运行时间”;电脑鼠从第一次激活到每次运行开始所花费的时间称为“迷宫时间”;电脑鼠在比赛时手动辅助的动作称为“碰触”。竞赛使用这3个参数,从速度、求解迷宫的效率和电脑鼠的可靠性三个方面来进行评判。 电脑鼠的得分是通过计算每次运行的“排障时间”来衡量的,即将迷宫时间的1/30加一次运行时间;如果未被碰触过,则再减去10s(奖励时间),这样得到的就是排障时间。电脑鼠在迷宫中停留或运行的总时间不可超过15min,在限时内允许运行多次。如果进入迷宫是为了进行探测和记忆,则这次运行就称为“试跑”;如果进入迷宫是根据先前的记忆和经验,按照智能算法确定最佳路径,并以最快的速度到达目的地,则这次运行就称为“冲刺”。 2.2迷宫、电脑鼠规格 迷宫由256个方块组成,每个方块18 平方厘米,排成16行×16列。迷宫的隔板沿方块的四周布设,形成迷宫通道。如图1为迷宫照片。图2为电脑鼠样例照片,该电脑鼠采用ARM7处理器——LM3S615作为主控芯片。五组可测距的红外线传感器按照某固定频率对迷宫格周围障碍进行采样,获取迷宫隔板信息。 图1 迷宫照片图2 电脑鼠样例照片 2.3已有算法

小白鼠走迷宫

《小鼠走迷宫》实验报告 生技基地:孟祥东 0121121202 殷振琦 生物技术:李静新

小白鼠走迷宫 【摘要】本实验通过在人为设置的迷宫里,小白鼠不断感受复杂通道的结构,调整和改进自己的行为。随着训练次数的增加,条件反射逐渐建立,以至在大脑皮层形成记忆。通过记录动物搜寻食物的时间长短可以对此加以评价。 【关键词】小白鼠迷宫记忆 前言:《实验动物学》最近10年,遗传科学家对两种动物建立了一系列遗传工程的技术,可以改变(去掉或加上)其体内基因的组成,这两种动物是老鼠和果蝇。在哺乳类动物中,老鼠可谓具有得天独厚的优势。昆虫类的果蝇行为简单,脑也较小,不如哺乳类的老鼠脑较大。此外,老鼠也更接近人类,通过老鼠的实验可以间接地了解人脑的功能。学习和记忆是神经系统高级中枢的重要机能之一。学习是神经系统不断接受环境刺激而获得的行为习惯和经验;获得的行为习惯和经验维持一定时间的能力就是记忆。动物的学习和记忆能力对其生存具有重要意义。本次实验,我们通过观察,分析小白鼠学习和记忆过程,理解大脑在动物行为机制建立中的作用;通过实验,了解数据统计分析在科学研究中的重要作用。 1.材料与方法 1.1材料 小白鼠、纸板(做迷宫)、食物、秒表 1.2方法 1.2.1 饥饿处理的小白鼠1只,放置在迷宫入口,记录其找到食物所需时间。5分钟后, 重复上述步骤,同样的间隔时间对其进行相同实验,每只小白鼠共计进行6次实 验。 1.2.2 对另一只进行饥饿处理的小鼠进行相同实验,记录每只小白鼠找到食物所需时 间。 1.2.3 绘制图表,进行数据分析。 2.结果 2.2曲线图

注:纵坐标表示所用时间(单位:秒),横坐标表示实验次数,系列一表示小鼠B,系列二表示小鼠A 2.3分析 2.3.1 随着小白鼠学习和记忆过程的进行,小白鼠找到食物的时间越来越短; 2.3.2 气温对小白鼠的活动能力有较大影响,低温使小白鼠活动能力降低; 3、讨论 德国心理学家艾宾浩斯(H.Ebbinghaus)研究发现,遗忘在学习之后立即开始,而且遗忘的进程并不是均匀的。最初遗忘速度很快,以后逐渐缓慢。他认为"保持和遗忘是时间的函数",并根据他的实验结果绘成描述遗忘进程的曲线,即著名的艾宾浩斯记忆遗忘曲线。 人的大脑是一个记忆的宝库,人脑经历过的事物,思考过的问题,体验过的情感和情绪,练习过的动作,都可以成为人们记忆的内容。例如英文的学习中单词、短语和句子,甚至文章的内容都是通过记忆完成的。从"记"到"忆"是有个过程的,这其中包括了识记、保持、再认和回忆。有很多人在学习英语的过程中,只注重了学习当时的记忆效果,孰不知,要想做好学习的记忆工作,是要下一番工夫的,单纯的注重当时的记忆效果,而忽视了后期的保持和再认同样是达不到良好的效果的。 在信息的处理上, 记忆是对输入信息的编 码、贮存和提取的过程, 从信息处理的角度上, 英文的第一次学习和背 诵只是一个输入编码的 过程。人的记忆的能力

c语言迷宫问题的求解(栈和递归)

实验报告 【实验名称】项目一迷宫问题的求解 【实验目的】 1.了解栈的基本操作以及充分理解栈的特点。熟悉掌握栈的基本操作和结构体 的运用。 2.学会用栈或者递归方法解决迷宫问题。 【实验原理】 1.本次实验中,以二维数组maze[row][col]表示迷宫,0表示通路,1表示墙,在构建迷宫时,为了清晰显示,在最外层添加一圈墙。 2.算法的核心思想是利用栈后进先出的特点,对迷宫进行探索,如果此路可行,则将此坐标的信息入栈,如果此路不通,则将此坐标的信息出栈。 3.输入形式:根据控制台的提示,依次输入迷宫的行数、列数,然后输入迷宫,再输入入口和出口坐标。 4.输出形式:由用户选择,由递归、非递归两种求解方式输出一条迷宫通路。以非递归方式会显示一种求解方案,并给出相应的三元组序列和迷宫方阵;以递归方式则会显示出所有的路线。 【实验内容】 1.需求分析 (1)问题描述 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 要求以递归和非递归两种方式分别输出一条迷宫的通路,以带方向坐标和迷宫图像表示。

(2)基本要求 (1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。 (2)编写递归形式的算法,求得迷宫中所有可能的通路。 (3)以方阵形式输出迷宫及其通路。 2.概要设计 (1)栈的抽象数据类型 ADT Stack{ 数据对象:D={ai|ai∈ElemSet, i=1,2, …,n, n≥0} 数据关系:R1={|ai-1,ai∈D, i=1,2, …,n } 约定an端为栈顶,a1端为栈底。 基本操作: InitStack( &S ) 操作结果:构造一个空栈S。 DestroyStack ( &S ) 初始条件:栈S已存在。 操作结果:销毁栈S。 ClearStack( &S ) 初始条件:栈S已存在。 操作结果:将S清为空栈。 StackEmpty( S ) 初始条件:栈S已存在。 操作结果:若S为空栈,则返回TRUE,否则返回FALSE。 StackLength( S ) 初始条件:栈S已存在。 操作结果:返回S的数据元素个数,即栈的长度。 GetTop( S, &e ) 初始条件:栈S已存在且非空。 操作结果:用e返回S的栈顶元素。 Push( &S, e ) 初始条件:栈S已存在。 操作结果:插入元素e为新的栈顶元素。 Pop( &S, &e ) 初始条件:栈S已存在且非空。 操作结果:删除S的栈顶元素,并用e返回其值。 }ADT Stack (2)程序模块

智能小车中的迷宫算法

智能小车中的迷宫算法 2008-10-27 15:20 智能小车中的迷宫算法 看了周立功上面的电脑鼠走迷宫的视频感觉非常有趣,一直都做个小车玩,可没材料,只能看着视频上的小车路行轨迹整出来了这个算法,我不知道真正的算法是怎么实现的,这只是我自己想的一个算法,而且没有完整的小车程序,有空买了小车的再整理总程序。 https://www.360docs.net/doc/5a10540186.html,/pro_ydkz/MicroMouse615.asp这是视频地址。 先看看那大体的迷宫图,随便画的,不是很准确,红色的是小车的运行轨迹,蓝色小圈表示要保存的节点,右下角是起始点: 首先是数据结构,对于整个程序来说,首先要做的是把整个图存下来,有过数据结构基础的这个应该不难,图一般是以结点的方式存储,也就是图中的蓝色小圈,结点的存储格式也是很重要的,我前后尝试了好几种才确定下来。节点有两中逻辑相连方式,一个是图形连接,对应* lt_north,*lt_west,*lt_south,*lt_east,一个是线性连接,对应*frontpoint和*nextpoint,线性连接是为了容易判断当前小车所到结点是否已经记录,也为了后面迷宫算法的树形实现。如下:Struct mappoint { Float point_x,point_y; //我是以坐标形式存储,这事相对坐标 Bool ltb_north,ltb_west,ltb_south,ltb_east; //这是记录每个结前后左右 是否有相通结 Mappoint * lt_north,*lt_west,*lt_south,*lt_east; //这是前后左右相通节点的地址

栈的应用-迷宫问题-数据结构(C语言版)-源代码(直接运行)

#include #include #include #define STACK_INIT_SIZE 100 #define INCREMENT 10 typedef struct { int r; int c; }zuobiao; typedef struct { int ord; //在当前坐标上的“标号” zuobiao seat; //坐标 int di; //走向下一通道的方向 }lujing; typedef struct { int sz[10][10]; }Maze; typedef struct SqStack { lujing *base; lujing *top; int size; }SqStack; int initStack(SqStack *s) { s->base = (lujing *)malloc(STACK_INIT_SIZE*sizeof(lujing) ); if(!s->base) return -1; s->top = s->base; s->size = STACK_INIT_SIZE; return 0; } int push(SqStack *s, lujing e) {

if(s->top - s->base >= s->size) { s->base = (lujing *)realloc(s->base, (s->size+INCREMENT)*sizeof(lujing)); if(!s->base) return -1; s->top = s->base+s->size; s->size += INCREMENT; } *s->top++ = e; return 0; } int pop(SqStack *s,lujing *e) { if(s->top == s->base) return -1; *e = *(--s->top); return 0; } int isEmpty(SqStack *s) { if(s->base == s->top) return 1; else return 0; } int pass( Maze maze,zuobiao dqzb) { if (maze.sz[dqzb.r][dqzb.c]==1) return 1; // 如果当前位置是可以通过,返回1 else return 0; // 否则返回0 } void footPrint(Maze &maze,zuobiao dqzb) { maze.sz[dqzb.r][dqzb.c]=9; } void markPrint(Maze &maze,zuobiao dqzb) { maze.sz[dqzb.r][dqzb.c]=4; } zuobiao nextPos(zuobiao dqzb, int Dir) {

迷宫算法求解

/* ****************迷宫算法求解***************** */ /* bc++3.1和vc++6.0下调试通过* */ /*********设计目标:教学演示**********************/ #include #include #include "stdlib.h" #define NULL 0 #define rows 10 #define cols 10 typedef struct {int row; int col; }PosType; //坐标点结构 typedef struct {int ord;//通道块在路径上的"序号" PosType seat;//通道块在迷宫中的"坐标位置" int di;//从此通道快走向下一通道块的"方向" }SElemType;//栈的元素类型 typedef struct {SElemType *base; SElemType *top; int stacksize; }SqStack;//堆栈结构 int InitStack(SqStack &s)//初始化堆栈 { s.base=(SElemType *)malloc(100*sizeof(SElemType)); if(!s.base) return 0; s.top=s.base; s.stacksize=100; return 1; }

int StackEmpty(SqStack s) //栈空判别 {return(s.top==s.base); } int Pop(SqStack &s,SElemType &e)//弹栈 {if(s.top==s.base)return 0; e=*--s.top; return 1; } int Push(SqStack &s,SElemType e)//将元素压入堆栈 {if(s.top-s.base>=s.stacksize) {s.base=(SElemType *)realloc(s.base,(s.stacksize+10)*sizeof(SElemType)); if(!s.base)exit(-2); s.top=s.base+s.stacksize; s.stacksize+=10; } *s.top++=e; return 1; } static int maze[rows][cols]= {{0,0,0,0,0,0,0,0,0,0}, {0,1,1,0,1,1,1,0,1,0}, {0,1,1,0,1,0,1,0,1,0}, {0,1,1,0,1,0,0,1,1,0}, {0,1,1,0,0,1,1,1,1,0}, {0,1,1,1,0,1,1,1,1,0}, {0,1,0,1,1,1,0,1,1,0}, {0,1,0,0,0,1,0,0,1,0}, {0,0,1,1,1,1,1,1,1,0}, {0,0,0,0,0,0,0,0,0,0}, }; //初始迷宫数据(1-通,0-不通)

《数据结构课程设计》走迷宫游戏

信息工程学院 课程设计报告 课程名称《数据结构》 课题名称走迷宫游戏 专业 班级 学号 姓名 联系方式 指导教师 2015 年 12 月 27 日

目录 1、数据结构课程设计任务书............................................................... 1 1.1、题目........................................................................... 1 1.2、要求........................................................................... 1 2、总体设计............................................................................. 1 2.1、设计思路及总体组成框架......................................................... 1 2.2、操作流程图..................................................................... 2 3、详细设计............................................................................. 5 3.1、程序中所采用的数据结构及存储结构的说明......................................... 5 3.2、函数功能模块说明............................................................... 5 3.3、各函数的调用关系 ............................................................................................................................... 7 4、调试与测试:......................................................................... 7 4.1、调试方法与步骤:............................................................... 7 4.2、测试结果的分析与讨论:......................................................... 8 4.3、测试过程中遇到的主要问题及采取的解决措施:................................... 10 6、源程序清单......................................................................... 10 7、数据结构课程设计总结............................................................... 14 8、参考文献........................................................................... 14

迷宫问题的C++算法实现

#ifndef MMIGONG_H #define MMIGONG_H #define MAX_SIZE 100 #include using namespace std; struct Node { int x; int y; int di; }; class Stack { private: int rrow; int ccolm; int top; int count; int minlenght; Node stack[MAX_SIZE]; Node sstack[MAX_SIZE]; public: Stack(); //初始化 //int **InsortMiGong(); //输入迷宫(即一个二维数组) void FindPath(int ab[][10]); //找出迷宫的出路 }; Stack::Stack() //初始化 { rrow=0; ccolm=0; top=-1; count=1; minlenght=MAX_SIZE; } /*int ** Stack::InsortMiGong() //输入迷宫(即一个二维数组) { int row=1,colm=1; while(true) { cout<<"请输入迷宫的行数和列数:";

cin>>row>>colm; if(row<=0||colm<=0) { cout<<"输入错误!请重新输入:"<>mg[i][j]; return mg; }*/ void Stack::FindPath(int ab[][10]) //找出迷宫的出路 { int a,b,di,find,k; top++;stack[top].x=1; stack[top].y=1; stack[top].di=-1; ab[1][1]=-1; while(top>-1) { a=stack[top].x; b=stack[top].y; di=stack[top].di; if(a==8&&b==8) { cout<

迷宫问题实验报告用栈解决迷宫问题

数据结构实验报告 题目:用栈解决迷宫问题 .需求分析 1.以结构体 Maze 表示迷宫,其中 pos 表示该位置是否有障碍; freq 记录该位置被经过的次数;数组 move 表示下一步的方向。 2. 本程序自动随机生成一个12 × 12大小的迷宫,字符“ H”表示有障碍,空符表示通 路。 3. 迷宫的入口为左上角,出口为右下角。 4. 本程序只求出一条成功的通路。 .概要设计 为了实现上述操作,以栈为存储结构。 本程序包含三个模块: 1)主程序模块 :实现人机交互。 2)迷宫生产模块:随机产生一个12× 12的迷 宫。 3)路径查找模块:实现通路的查找。 4)求解迷宫中一条通路的伪代码: do{ 若当前位置可同,则{ 将当前位置插入栈顶;若该位置是出口位置,则结束;否则切换当前位置的东临方块为新的当前位置;} 否则 { 若栈不空且栈顶位置尚有其他方向未被探索,则设定新的的当前位置为沿顺时针 方向旋转找到的栈顶位置的下一相邻块若栈不空但栈顶位置的四周均不可通, 则{ 删去栈顶位置; 若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈 至栈空。 } } } while( 栈不空 ) 三. 详细设计栈的设计: typedef struct { Node *base,*top; int length; }Stack; Stack *initstack(); // 初始化栈 void printstack(Stack *s); // 打印栈 Status destroy(Stack *); // 销毁整个栈 Status deltop(Stack *s); // 出栈 Status pushelem(Stack *,ElemType ,ElemType); // 进栈 1. 主程序模块: int main() { printf(" 随机产生一个12× 12 的迷宫, X 字符表示障碍,空符表示通路: \n"); Maze a[N][N]; makemaze(a); printf(" 输入回车键显示路径 ,* 字符表示路径。 \n"); getchar(); findpath(a); while(1); return 0;

人工智能电脑鼠搜迷宫实验

北京科技大学实验报告 学院:自动化学院专业:智能科学学技术班级: 姓名:学号:实验日期:2017年11月6日 实验名称:人工智能电脑鼠搜迷宫实验 实验目的:掌握电脑鼠的基本操作及智能搜索算法操作。 实验仪器:KEIL MDK、电脑鼠、J-Link、VS 实验原理:所谓“电脑鼠”,英文名叫做Micromouse,是一种具有人工智能的轮式机器人,是由嵌入式微控制器、传感器和机电运动部件构成的一种智能行走装置的俗称。当电脑鼠放入起点,按下启动键之后,他就必须自行决定搜索法则并且在迷宫中前进,转弯,记忆迷宫墙壁资料,计算最短路径,搜索终点等功能。电脑鼠更结合了机械、电机、电子、控制、光学、程序设计和人工智能等多方面的科技知识。本实验中,通过红外传感器检测电脑鼠所处位置状态,通过智能算法保存地图并实现地图的搜索,通过pid等控制算法控制电机,达到电脑鼠搜索迷宫并计算最短路径等功能。 实验内容与步骤: 实验内容 1)KEIL MDK的安装 2)电脑鼠硬件的检查及调整 3)智能搜索算法的编写 4)算法的调试与优化 5)实验结果

实验步骤 (一)KEIL MDK的安装 1双击运行Ke i l MDK 4.12 安装程序,出现软件安装界面,如图所示: 2点击Next,勾选安装协议; 3选择安装路径,建议安装在C 盘,运行速度快些 4 填入用户信息,个人用户随意填入即可; 点击Next 就进入实质的安装过程了,Wait for a Whle… 5点击Finish,Keil MDK 就完成安装了,可以发现桌面上生成了名为“Keil uVis ion4”的可执行文件快捷方式。

(二)检查和调整电脑鼠的硬件 1.电机检查:在电脑鼠程序文件中找到Motor.c文件,直接为两侧电机赋相同的速度值,用G-link连接电脑鼠和电脑,传入程序,打开电脑鼠放在地面上,如果电脑鼠能正常直线行进,即证明两侧电机正常工作。如果有电机有问题,拆下原来的电机换新的再次进行电机检查即可。 2.传感器检查:用G-link连接电脑鼠和电脑,打开传感器查询模式,用手逐渐靠近每一个传感器,如果相应的传感器值由小变大,那么此传感器工作正常。且每个传感器在手指位于相同距离时,回传的传感器值近似相等即证明传感器都正常工作,如果有传感器有问题,拆下原来的传感器换新的再次进行传感器检查即可。 传感器回传值查询界面 (三)智能搜索算法的编写 在含底层驱动的程序的基础上加上算法,实现智能搜索,把电脑鼠变成一只真正的智能的老鼠。

求解迷宫问题

求迷宫问题就是求出从入口到出口的路径。在求解时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前试探,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续试探,直至所有可能的通路都试探完为止。为了保证在任何位置上都能沿原路退回(称为回溯),需要用一个后进先出的栈来保存从入口到当前位置的路径。 首先用如图所示的方块图表示迷宫。对于图中的每个方块,用空白表示通道,用阴影表示墙。所求路径必须是简单路径,即在求得的路径上不能重复出现同一通道块。 为了表示迷宫,设置一个数组mg,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块为墙,如图所示的迷宫,对应的迷宫数组mg如下: int mg[M+1][N+1]={ /*M=10,N=10*/ {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} }; 伪代码: c语言描述如下:

void mgpath() /*路径为:(1,1)->(M-2,N-2)*/ { int i,j,di,find,k; top++; /*初始方块进栈*/ Stack[top].i=1; Stack[top].j=1; Stack[top].di=-1; mg[1][1]=-1; while (top>-1) /*栈不空时循环*/ { i=Stack[top].i; j=Stack[top].j; di=Stack[top].di; if (i==M-2 && j==N-2) /*找到了出口,输出路径*/ { printf("迷宫路径如下:\n"); for (k=0;k<=top;k++) { printf("\t(%d,%d)",Stack[k].i,Stack[k] .j); if ((k+1)%5==0) printf("\n"); }

电脑鼠走迷宫比赛规则

電腦鼠走迷宮比賽規則 一、電腦鼠的規定 1.電腦鼠必須以紅外線光感測器偵測迷宮路徑行走;不得以機械式的感測裝置 (包含導輪)碰觸迷宮路徑的牆板行走。 2.電腦鼠必須為自立型,不得以無線電波遙控。 3.電腦鼠不得躍過、攀登、損傷或破壞迷宮壁面。 二、迷宮的規定 1.電腦鼠迷宮,如[圖一]所示,單位方塊壁面的側面為白色,頂部為紅色,平 面為黑色。 2.電腦鼠迷宮以一定大小的正方形單位方塊構成,整個迷宮的外圍也是正方 形。所有的迷宮方塊至少有一個方向被壁面擋住。某些迷宮的路徑寬度為兩個迷宮方塊的寬度,如黃色部分所示。 3.電腦鼠迷宮的單位方塊為18cmX18cm,整個迷宮由16X16個迷宮方塊組 成,面積為288cmX288cm。電腦鼠迷宮的外圍全部相連接起來,壁面的高度為5cm,厚度為1.2cm。 4.迷宮是以一般的精度製作,有可能產生某種程度上的尺寸誤差(約1mm)。 三、比賽規則 1.參加隊伍於比賽前由各隊選手(或選手代表)抽籤決定出賽次序。每隊限一個 操控手下場比賽。 2.比賽開始前,所有參賽的電腦鼠均須以大會提供的塑膠袋封起來,貼上裁判 簽名的封條。輪到下場比賽的隊伍,操控手須在裁判示意下打開塑膠袋,操控電腦鼠下場比賽。當裁判發出哨聲後,操控手即可啟動電腦鼠。 3.電腦鼠由迷宮的一角出發,以達到終點(在迷宮的中心)時間短者為第一名, 餘依次類推。 4.電腦鼠最多可擁有6分鐘,比賽期間最多可行進6次,以這段時間內最快到 達迷宮終點的時間為比賽成績。如在比賽時間內無法達到終點者,以比賽時間到時,電腦鼠距離終點的距離為比賽成績,此項距離越短者成績越高。 5.電腦鼠在比賽中碰觸迷宮牆壁達到3次或一次碰觸超過3秒卡住者即須退 場,其成績依未到達終點者之方法計算,以退場時之位置為行走距離的量測點。 6.操控手不得在迷宮路徑公開之後,把迷宮的路徑資料輸入電腦鼠,即比賽中 不得從事程式的置入(loading)及ROM的更換。

相关文档
最新文档