3.3栈的应用--迷宫求解.pptVIP

  • 20
  • 0
  • 约2.85千字
  • 约 21页
  • 2017-09-06 发布于重庆
  • 举报
3.3 栈的应用--迷宫求解 例四、迷宫【问题描述】 以一个 m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路。或得出没有通路的结论 迷宫用计算机来求解方法其实很简单, 就是走遍所有可能的路径,直到找到出口为止, 当走到错误的路线的时候,就退回上一个路口交叉点,选择其他方向. 这种思维其实用堆栈(stack)完全可以解决 迷宫思路 ?在设计这个问题时,我考虑到以下几点: ????????1、迷宫入口和出口的坐标 ????????2、保存迷宫的2维数组 ????????3、获得路径的函数 我们模仿人走迷宫时的思路,设置一个当前点,一个目标点(下一个要走的点)。初始情况下当前点为入口,终止条件为当前点为出口,这样,我们的函数大概结构就出来了。 ????????在从入口到出口的过程中程序对当前点的上、下、左、右四个点依次进行判断,当发现任一个方向是未走过的区域时,就将当前点指向那个点进行尝试,同时将当前点入栈并做标记。而当4个方向都不通或已走过时,则为死路,标记当前点为死路并从栈中弹出上一个点继续进行尝试,这时因为当前点已被标记为死路,则弹出上一个点时就不会重复这条路,达到寻找正确路径的效果。 描述: 当前点: 坐标位置(x,y),可用二维数组实现(seat) 记录当前点探索的方向:di 如起点为(1,1),先判断东(1),南(2),西(3),北(4),顺时针方向转,判断其邻居是否通,不同的话,邻居转向下一个方向探索,若均不通,则按原路返回,退栈.取栈顶元素,沿下一个方向探索 注意:凡走过的也要标记符号: 迷宫的分析 迷宫设置为一个2维数组,通路为1,不通为0,但是四周为屏障 设置一个栈来存储迷宫的路径:记录每个位置的坐标值(x,y),同时将纳入栈中的路径,记录它来自何方,也就是记录它的探测方向编号(东,南,西,北类似于地图的指示,1,2,3,4) 通的话就入栈操作:(x,y,di) 探测当前坐标位置的所有邻居均不通:出栈,打上脚印,此路不通,不再加入 再对栈顶重新探测寻求新的邻居入栈 直到达到迷宫出口(有解)或退回到原路的入口(无解) 程序流程图 迷宫算法 迷宫演示见cd中的递归 cd迷宫 DS-Algo-VC下的第三章算法3.3 实验内容 一个m×n的迷宫,0:畅通,1:障碍, 设计一个程序,对任意设定的迷宫,求出从入 口到出口的通路。入口:1 1;出口:6 8 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 0 0 实现提示 1.用一种称为广度搜索的算法,将迷宫的入 点(1,1)作为第一个出发点,向四周搜 索可通行的位置,形成第一层新的出发 点,然后对第一层中各个位置再分别向四 周搜索可通行的位置,形成第二层新的出 发点,如此进行下去直至到达迷宫的出口 点(m,n)为止。 实现提示 2.为了避免多次检测是否走到边沿,将迷宫 周围各镶上一条边,相当于在迷宫的周围 布上一圈不通过的的墙。 3.为了避免有的点被重复到达,应标志已通 过的位置,可以采用一个标志数组来标志 已通过了的位置。 实现提示 4.为了记录搜索过程中到达位置及其出发 点,可以建立一个结构体数组,数组的每 组元素有三个域x,y,pre,其中分别记 录x和y到达位置的行、列坐标,pre记下 其出发点在数组中的坐标 程序流程图 注意问题 1.同学们可以先按照给定的迷宫去做,完 成的情况下可以将迷宫改成可根据输入 变化的任意迷宫。 2.注意数组表示的迷宫下标和现实迷宫下 标的不同。 3.跟踪迷宫求解过程中程序的执行情况, 以加深对程序执行过程的理解。 注意问题 4.注意调试过程中的问题记录,以提高程 序调试的能力 5.调试过程中遇到死循环可用Ctrl+C或 Ctrl+Break退出。 实验结果 不同的算法会产生不同的结果。 * * * * 例四、 迷宫求解 通常用的是“穷举求解”的方法 ? ? ? ? ? ? ? ? ? ? ? ? ? 1 1 1 1 2 2 2 2 2 3 2 1 3

文档评论(0)

1亿VIP精品文档

相关文档