复习用-第二个项目迷宫题目
- 格式:pptx
- 大小:53.87 KB
- 文档页数:4


迷宫问题算法一、引言迷宫问题是一个经典的算法问题,对于寻找路径的算法有着广泛的应用。
迷宫是一个由通路和墙壁组成的结构,从起点出发,要找到通往终点的路径。
迷宫问题算法主要解决的是如何找到一条从起点到终点的最短路径。
二、DFS(深度优先搜索)算法深度优先搜索算法是迷宫问题求解中最常用的算法之一。
其基本思想是从起点开始,沿着一个方向不断向前走,当走到无法继续前进的位置时,回退到上一个位置,选择另一个方向继续前进,直到找到终点或者无路可走为止。
1. 算法步骤1.初始化一个空栈,并将起点入栈。
2.当栈不为空时,取出栈顶元素作为当前位置。
3.如果当前位置是终点,则返回找到的路径。
4.如果当前位置是墙壁或者已经访问过的位置,则回退到上一个位置。
5.如果当前位置是通路且未访问过,则将其加入路径中,并将其邻居位置入栈。
6.重复步骤2-5,直到找到终点或者栈为空。
2. 算法实现伪代码以下为DFS算法的实现伪代码:procedure DFS(maze, start, end):stack := empty stackpath := empty listvisited := empty setstack.push(start)while stack is not empty docurrent := stack.pop()if current == end thenreturn pathif current is wall or visited.contains(current) thencontinuepath.append(current)visited.add(current)for each neighbor in getNeighbors(current) dostack.push(neighbor)return "No path found"三、BFS(广度优先搜索)算法广度优先搜索算法也是解决迷宫问题的常用算法之一。
迷宫问题4 迷宫问题以⼀个m*n的长⽅阵表⽰迷宫,0和1分别表⽰迷宫中的通路和障碍。
设计⼀个程序,对任意设定的迷宫,求出⼀条从⼊⼝到出⼝的通路,或得出没有通路的结论。
基本要求:(1)⾸先实现⼀个以链表作存储结构的栈类型,然后编写⼀个求解迷宫的⾮递归程序。
求得的通路以三元组(i,j,d)的形式输出,其中(i,j)指⽰迷宫中的⼀个坐标,d表⽰⾛到下⼀坐标的⽅向。
(2)测试⼏组数据,数据的规模由⼩变⼤,即⽹格越来越⼩,障碍越来越复杂。
拓展要求:实现该问题的可视化界⾯,⽤⿏标点击即可⼀步步⾛出迷宫。
提⽰:计算机解迷宫问题通常采⽤“穷举求解”⽅法。
1.需求分析以⼀个m*n的长⽅阵表⽰迷宫,0和1分别表⽰迷宫中的通路和障碍。
设计⼀个程序,对任意设定的迷宫,求出⼀条从⼊⼝到出⼝的通路,或得出没有通路的结论。
输⼊迷宫的长和宽,以⽅阵形式输出迷宫及其通路。
2.设计2.1 设计思想(1)数据结构设计以链表作存储结构的栈类型.原因:便于探索迷宫路径(2)算法设计先按⾃⼰的意图创建⼀个迷宫矩阵,接着创建两个以链表作存储结构的栈p和q,p存储路径,⽽q存储探索路径,当有新位置时就把q中栈顶元素传给p,没有时就出栈,即遇到死路时返回。
总体上包括三个模块,CreatMaze是创建⼀个迷宫,FindMaze找到迷宫路径。
Print 则是打印这个路径。
主程序的流程图2.2 设计表⽰(1)函数调⽤关系图如上图(2)函数接⼝规格说明Int** CreatMaze(int &m,int &n )输⼊并获取迷宫Bool findMaze(int**maze,int m,int n)⽤于寻找迷宫从(0,0)到(m,n)的路径Void PrintPath(Stack p)⽤于输出迷宫的路径2.3 详细设计主要算法的实现bool FindMaze(int **maze,int m,int n)//寻找迷宫maze中从(,)到(m,n)的路径//到则返回true,否则返回false{Stack q,p; //定义栈p存储路径,q存探索迷宫的过程T Temp1,Temp2;int x,y,loop;Temp1.x=1;Temp1.y=1;q.Push(Temp1); //将⼊⼝位置⼊栈p.Push(Temp1);maze[1][1]=-1; //标志⼊⼝位置已到达过while(!q.empty()) //栈q⾮空,则反复探索{Temp2=q.GetPop(); //获取栈顶元素if(!(p.GetPop().x==q.GetPop().x && p.GetPop().y==q.GetPop().y)) p.Push(Temp2);//如果有新位置⼊栈,则把上⼀个探索的位置存⼊栈pfor(loop=0;loop<4;loop++) //探索当前位置的个相邻位置{x=Temp2.x+move[loop][0]; //计算出新位置x位置值y=Temp2.y+move[loop][1]; //计算出新位置y位置值if(maze[x][y]==0) //判断新位置是否可达{Temp1.x=x;Temp1.y=y;maze[x][y]=-1; //标志新位置已到达过q.Push(Temp1); //新位置⼊栈}if((x==(m))&&(y==(n))) //成功到达出⼝{Temp1.x=m;Temp1.y=n;Temp1.dir=0;p.Push(Temp1); //把最后⼀个位置⼊栈PrintPath(p); //输出路径return 1; //表⽰成功找到路径}}if(p.GetPop().x==q.GetPop().x&&p.GetPop().y==q.GetPop().y)//如果没有新位置⼊栈,则返回到上⼀个位置{p.Pop();q.Pop();}}return 0; //表⽰查找失败,即迷宫⽆路经}3.调试分析(1)为避免输⼊迷宫时与长宽的不便,故使输⼊从(1,1)开始,(m,n)结束,将外围置为1;找到路径时,发现输出的是倒的,于是创建了第三个栈,将存储路径转移再输出,就可以正确实现了。
迷宫问题课程名称: 程序设计与算法综合训练训练题⽬: 迷宫问题的求解姓名:院系: 计算机科学与技术学院专业:计算机科学与技术学号:指导教师:殷赵霞年⽉⽇1 需求分析在该部分中根据设计题⽬的要求,充分地分析和理解问题,叙述系统的功能要求,明确问题要求做什么?限制条件是什么?分析:在⼀个m*n的迷宫中寻找通路,0代表通,1代表不通,迷宫是任意的,要求从⼊⼝到出⼝找通路,要求是⽤链表,输出通路,(x,y,d),x,y是坐标,d是⽅向,以⽅阵形式输出迷宫和通路1.1问题描述以⼀个m*n的长⽅阵表⽰迷宫,0和1分别表⽰迷宫中的通路和障碍。
设计⼀个程序,对任意设定的迷宫,求出⼀条从⼊⼝到出⼝的通路,或得出没有通路的结论。
1.2基本要求(1) 输⼊的形式和输⼊值的范围:(2) 输出的形式;整形int(3) 程序所能达到的功能:找到从⼊⼝到出⼝的通路,输出迷宫以及通路(1)⾸先实现⼀个以链表作存储结构的栈类型,然后编写⼀个求解迷宫的⾮递归程序。
求得的通路以三元组(i,j,d)的形式输出。
其中:(i,j)指⽰迷宫中的⼀个坐标,d表⽰⾛到下⼀坐标的⽅向。
如,对于教材第50页图3.4所⽰的迷宫,输出⼀条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。
(2)编写递归形式的算法,求得迷宫中所有可能的通路。
(3)以⽅阵形式输出迷宫及其通路。
2 概要设计说明本程序中⽤到的所有抽象数据类型的定义。
主程序的流程以及各程序模块之间的层次(调⽤)关系。
抽象数据有Maze[11][10]:迷宫en_x,en_y是指⼊⼝坐标(entrance)ex_x,ex_y是指出⼝坐标(exit)主程序的流程开始定义栈的指针p;定义栈S;P=&S开始⼀系列定义InitMaze(Maze)输⼊aIf a=1{ 打印输出迷宫Printf(“请输⼊出⼝坐标”);输⼊elem_10和elem_11;令en_x=elem_10;en_y=elem_11Printf(“请输⼊出⼝坐标”)输⼊elem_20和elem_21令ex_x=elem_20;en_y=elem_21If(所输⼊的四个变量超出应有范围){输出“输⼊的⼊⼝或出⼝坐标错误\n”}Else{换⾏输⼊“说明(x,y,z)x,y代表坐标点:\n”输⼊“z代表上个坐标到达这个坐标所⾛的⽅向”输⼊“查找路径的具体步骤”初始化栈Push(p,en_x,en_y,d)⽤Ways函数}Return main()否则输出“退出”}结束各模块间的层次关系(1)main()(2)Ways()(3)InitMaze(4)menu()(5)Print(Maze)(6)Push()(7)InitStack(p)2.1数据结构2.2程序模块(1).定义栈(2.)初始化栈InitStack(Stack*p)(3).⼊栈Push(stack*p,intx,inty,int d)(4).出栈Pop(Stack*p,int read[2],int d)(5).初始化迷宫InitMaze(int Maze[11][10])(6).打印输出迷宫Print(int Maze[11][10])(7)寻找路径Ways(Stack*p,int Maze[11][10],inten_x,inten_y,intex_x,intex_y)(8).菜单menu()2.3各模块之间的调⽤关系及算法设计调⽤关系main()Ways()Push()Pop()InitMaze()menu()Print(Maze)Push()InitStack(p)算法分析在该问题要求中最主要的就是寻找路径,即Ways函数,⽅向是采⽤的顺时针⽅向,上下左右分别⽤1234来代替,从上开始,⼜要求输出坐标,故可以是令y=y+1来表⽰向上⾏⾛了⼀步,其余的左右下可以⽤类似的⽅法,然后与此同时确定d的数值,然后采⽤if语句来进⾏。