迷宫问题大作业讲解
- 格式:doc
- 大小:1.40 MB
- 文档页数:13
数据结构试验——迷宫问题(一)基本问题1.问题描述这是心理学中的一个经典问题。
心理学家把一只老鼠从一个无顶盖的大盒子的入口处放入,让老鼠自行找到出口出来。
迷宫中设置很多障碍阻止老鼠前行,迷宫唯一的出口处放有一块奶酪,吸引老鼠找到出口。
简而言之,迷宫问题是解决从布置了许多障碍的通道中寻找出路的问题。
本题设置的迷宫如图1所示。
图1 迷宫示意图迷宫四周设为墙;无填充处,为可通处。
设每个点有四个可通方向,分别为东、南、西、北(为了清晰,以下称“上下左右”)。
左上角为入口。
右下角为出口。
迷宫有一个入口,一个出口。
设计程序求解迷宫的一条通路。
2.数据结构设计以一个m×n的数组mg表示迷宫,每个元素表示一个方块状态,数组元素0和1分别表示迷宫中的通路和障碍。
迷宫四周为墙,对应的迷宫数组的边界元素均为1。
根据题目中的数据,设置一个数组mg如下int mg[M+2][N+2]={{1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1},{1,1,0,0,0,1,1,1},{1,0,0,1,0,0,0,1},{1,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1}};在算法中用到的栈采用顺序存储结构,将栈定义为Struct{ int i; //当前方块的行号int j; //当前方块的列号int di; //di是下一个相邻的可走的方位号}st[MaxSize];// 定义栈int top=-1 //初始化栈3设计运算算法要寻找一条通过迷宫的路径,就必须进行试探性搜索,只要有路可走就前进一步,无路可进,换一个方向进行尝试;当所有方向均不可走时,则沿原路退回一步(称为回溯),重新选择未走过可走的路,如此继续,直至到达出口或返回入口(没有通路)。
在探索前进路径时,需要将搜索的踪迹记录下来,以便走不通时,可沿原路返回到前一个点换一个方向再进行新的探索。
后退的尝试路径与前进路径正好相反,因此可以借用一个栈来记录前进路径。
数学运算迷宫题在这个数学运算迷宫中,我们将使用数学运算符号和数字在迷宫的路径上进行运算。
迷宫中的每个格子都包含一个数学表达式,通过计算表达式得出一个结果,继而决定接下来的路径。
本文将带你一起解决这些数学运算迷宫题,锻炼你的数学能力和逻辑思维。
迷宫题1:在这个迷宫题中,我们将使用加法和乘法两种运算符号。
迷宫的起点是数字3,终点是数字25。
每个格子包含的表达式是两个数字之和或者两个数字的乘积。
通过不断计算,找出一条从起点到终点的路径。
解:从起点数字3出发,我们可以选择加法或乘法作为第一个运算符号。
如果我们选择加法,路径将分为两条:3+7=10 和 3+9=12。
如果我们选择乘法,路径将是:3*6=18。
在这个示例中,只有一条路径满足要求,即起点数字3经过乘法运算得到数字18,然后再进行加法运算得到终点数字25。
因此,答案是3*6+7=25。
迷宫题2:这个迷宫题需要使用四则运算符号,即加法、减法、乘法和除法。
起点是数字4,终点是数字12。
每个格子包含的表达式是四则运算的结果。
通过运算,找出一条从起点到终点的路径。
解:从起点数字4出发,我们可以选择加法、减法、乘法或除法作为第一个运算符号。
如果我们选择加法,路径将分为两条:4+3=7 和4+7=11。
如果我们选择减法,路径将是:4-2=2。
如果我们选择乘法,路径将是:4*2=8。
如果我们选择除法,路径将分为两条:4÷2=2 和4÷4=1。
在这个示例中,存在多条路径满足要求,例如4+7+1=12和4*2+8=12等。
因此,答案不唯一。
迷宫题3:这个迷宫题增加了括号的运算。
起点是数字1,终点是数字10。
每个格子包含的表达式是带有括号的运算。
通过运算并找出一条正确的路径。
解:从起点数字1出发,我们可以选择不同的带有括号的运算。
例如,可以选择括号内的数字加1,并与括号外的数字相乘,得到下一个结果。
在本例中,我们可以选择(1+2)*3=9,然后再以此为基础进行运算,得到最终结果10。
迷宫问题的求解(回溯法、深度优先遍历、⼴度优先遍历)⼀、问题介绍 有⼀个迷宫地图,有⼀些可达的位置,也有⼀些不可达的位置(障碍、墙壁、边界)。
从⼀个位置到下⼀个位置只能通过向上(或者向右、或者向下、或者向左)⾛⼀步来实现,从起点出发,如何找到⼀条到达终点的通路。
本⽂将⽤两种不同的解决思路,四种具体实现来求解迷宫问题。
⽤⼆维矩阵来模拟迷宫地图,1代表该位置不可达,0代表该位置可达。
每⾛过⼀个位置就将地图的对应位置标记,以免重复。
找到通路后打印每⼀步的坐标,最终到达终点位置。
封装了点Dot,以及深度优先遍历⽤到的Block,⼴度优先遍历⽤到的WideBlock。
private int[][] map = { //迷宫地图,1代表墙壁,0代表通路{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}};private int mapX = map.length - 1; //地图xy边界private int mapY = map[0].length - 1;private int startX = 1; //起点private int startY = 1;private int endX = mapX - 1; //终点private int endY = mapY - 1; //内部类,封装⼀个点public class Dot{private int x; //⾏标private int y; //列标public Dot(int x , int y) {this.x = x;this.y = y;}public int getX(){return x;}public int getY(){return y;}}//内部类,封装⾛过的每⼀个点,⾃带⽅向public class Block extends Dot{private int dir; //⽅向,1向上,2向右,3向下,4向左public Block(int x , int y) {super(x , y);dir = 1;}public int getDir(){return dir;}public void changeDir(){dir++;}}/*⼴度优先遍历⽤到的数据结构,它需要⼀个指向⽗节点的索引*/public class WideBlock extends Dot{private WideBlock parent;public WideBlock(int x , int y , WideBlock p){super(x , y);parent = p;}public WideBlock getParent(){return parent;}}⼆、回溯法 思路:从每⼀个位置出发,下⼀步都有四种选择(上右下左),先选择⼀个⽅向,如果该⽅向能够⾛下去,那么就往这个⽅向⾛,当前位置切换为下⼀个位置。
一年级数字迷宫题讲解教案教案标题:一年级数字迷宫题讲解教案教学目标:1. 学生能够理解和解决一年级数字迷宫题。
2. 学生能够运用数学知识和逻辑思维解决问题。
3. 学生能够培养团队合作和沟通能力。
教学准备:1. 数字迷宫题的练习题目。
2. 白板、黑板或投影仪。
3. 学生用的纸和铅笔。
教学过程:引入:1. 引入数字迷宫题的概念,解释数字迷宫题是一种需要通过数学和逻辑思维解决的问题。
2. 引导学生思考数字迷宫题的特点和解题方法。
主体:1. 介绍数字迷宫题的规则和基本要素,例如:迷宫图、起点、终点、障碍物等。
2. 给学生展示一个简单的数字迷宫题,并解释如何通过数学和逻辑思维解决问题。
3. 指导学生分析迷宫图,找出可能的路径,并解释如何根据题目要求选择正确的路径。
4. 鼓励学生积极参与,提供他们解题的机会和时间,并及时给予指导和鼓励。
5. 引导学生思考解题过程中的困难和挑战,并提供必要的提示和帮助。
巩固:1. 给学生分发一些数字迷宫题的练习题目,让他们在小组内合作解题。
2. 监督学生的解题过程,及时纠正错误和提供指导。
3. 鼓励学生在小组内分享解题思路和方法,培养他们的团队合作和沟通能力。
4. 收集学生的解题答案,进行讲解和讨论,帮助学生理解和掌握解题方法。
拓展:1. 鼓励学生设计自己的数字迷宫题,并与同学交换解答。
2. 引导学生思考数字迷宫题的变种和扩展,进一步挑战他们的数学和逻辑思维能力。
评价:1. 观察学生在解题过程中的参与度和理解程度。
2. 收集学生的解题答案和思考过程,进行评价和反馈。
3. 针对学生的不足之处提供个别辅导和指导。
教学延伸:1. 鼓励学生在课后继续解决数字迷宫题,提高他们的数学和逻辑思维能力。
2. 推荐一些相关的数学游戏或在线资源,让学生在课余时间进行练习和巩固。
通过以上教案的指导,学生将能够理解和解决一年级数字迷宫题,运用数学知识和逻辑思维解决问题,培养团队合作和沟通能力。
同时,教师可以根据学生的实际情况进行适当的调整和拓展,以提高教学效果。
数学迷宫小学二年级数学期末题目详解在小学二年级的数学学习中,迷宫题目常常出现在期末考试中。
迷宫题目以其独特的题干设置和解题方法,给孩子们带来了一定的挑战。
本文将对小学二年级数学期末迷宫题目进行详细解析,帮助同学们更好地理解和解决这类题目。
首先,我们来看一个典型的迷宫题目:1. 以下是一个迷宫地图,请问小明从入口S走到出口E,一共需要经过几个格子?S . . . .. • • • .. • . • .. • . . •. . . • E对于这个题目,我们可以通过数格子的方法来解答。
从入口S到出口E,需要经过的格子数即为我们的答案。
让我们开始解题吧!首先,我们从入口S开始,按照迷宫地图的布局,我们将按以下步骤进行:1. 从S向右走一步,即到达了第2个格子;2. 从第2个格子向下走一步,即到达了第7个格子;3. 从第7个格子向右走一步,即到达了第8个格子;4. 从第8个格子向左走一步,即到达了第4个格子;5. 从第4个格子向下走一步,即到达了第9个格子;6. 从第9个格子向下走一步,即到达了第14个格子;7. 从第14个格子向右走一步,即到达了第15个格子;8. 从第15个格子向右走一步,即到达了出口E。
通过以上步骤,我们可以得出结论:小明从入口S走到出口E,一共需要经过15个格子。
迷宫题目并不难,只需小心地按图索骥,一步一步地找出通往出口的路径,就能够得出正确答案。
接下来,我们来看另外一个迷宫题目:2. 以下是一个迷宫地图,请问小红从入口S走到出口E,有几种不同的路径方案?S . . . . .. • • • • .. . . • . .. • • • . •. . . . . E对于这个题目,我们需要找出所有从入口S走到出口E的路径方案。
同样地,我们可以通过逐步分析来解答这个题目。
让我们开始解题:1. 从入口S开始,我们有两个方向可以选择:向右或向下。
2. 如果我们选择向右,那么继续往右走,直到无法再往右走为止。
数据结构课程设计大作业20140821班题目迷宫问题专业计算机科学与技术学生姓名姚鑫学号2014082309指导教师樊艳芬完成日期2016/5/19湖州师范学院信息工程学院目录内容摘要 (1)设计任务与技术要求 (2)总体设计方案 (2)数据结构和算法的设计 (2)程序清单 (3)程序测试与调试 (7)结论与体会 (10)迷宫问题【内容摘要】在一个m行,n列的迷宫中求从入口到出口的一条简单路径,即在求得路径上不能同时重复出现同一通道。
迷宫可用下图所示的方块来表示,每个方块或者是通道(用空白方块表示)或者是墙(用带阴影的方块表示)。
0和1分别表示迷宫中的通道和墙。
输出时简单路径用‘☆’表示,起点用‘入’表示,出口用‘出’表示,墙用‘■’表示,可走的路用‘’表示。
输入m,n,表示m行n列。
再输入m行n列的迷宫(用0和1组成的矩阵表示),再输入迷宫的起点和终点,输出迷宫(含有从起点到终点的简单路径)。
运用了深度优先搜索和递归的相关知识。
【关键字】深度优先搜索,递归【Abstract】Looking for a simple path from the entrance to the exit in a maze of M rows and N columns, that is, the road could not be repeated at the same time in the path. A maze can be shown as diamonds in the following figures. Each diamond is either road or wall. Well , a blank diamond shows the road and a black diamond shows the wall .In the program ,zero represents road ,and one represents wall.When we output,‘☆’represents road, enter stands for starting point ,out stands for exit and ‘■’represents wall. Well, ‘’stands for the way that we can choose.First we should type in m and n. Then type in rows of m and columns of n which can be represented by matrix made of zero and one. In the end, we should type in the starting point and exit.We have learned the information about Depth First Search and recursion.【Key words】Depth First Search,recursion一、实验内容概述(设计任务与技术要求)以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
问题求解报告1.题目简述:迷宫问题迷宫问题就是在8行8列的迷宫中寻找一条或多条从进口到出口的路径,并显示迷宫于屏幕同时显示出路径。
试以程序求出由入口至出口的路径。
2.求解方法:递归法首先用二维数组表示迷宫的结构,用2表示迷宫墙壁,使用1来表示行走路径,用0表示进口和出口。
其中迷宫用随机函数产生,即调用随机函数产生二维数组,进而用二维数组表示迷宫的结构。
采用递归法:在任意一个位置都有上、左、下、右四个行进方向,在每前进一格之前就选一个方向前进,无法前进时退回选择下一个可前进方向,然后选择一个行进顺序:先向右,后向下,再向左,最后向上;如此在二维数组中依序测试四个方向。
因此可以用递归调用,设置一个访问函数f(int i, int j):现在我们行进到A(i,j)处,依次判断其是否可以向右,向下,向左,向上前进,如果可以向右就优先向右,递归调用该函数f(i,j+1),如果不可以向右就判断是否可以向下,如果可以就递归调用函数f(i+1,j),直至递归函数的参数为出口的坐标,否则结束此次递归,返回没有可行的路径。
同时f也要用来处理某格是否被访问过,若被访问救将该处的值改为1。
3.结合程序代码的分析:(1).随机产生密迷宫的函数程序代码:void Random(int mg[8][8]){int i,j,k;srand((unsigned int )time(NULL));for(i=1;i<7;i++)for(j=1;j<7;j++){k=rand()%3; //随机生成0、1、2三个数if(k)mg[i][j]=0;elseelsemg[i][j]=2;}}for(j=0;j<8;j++)mg[0][j]=mg[7][j]=2; /*设置迷宫外围"不可走",保证只有一个出口和入口*/for(i=0;i<8;i++)mg[i][0]=mg[i][7]=2; /*设置迷宫外围"不可走",保证只有一个出口和入口*/mg[1][0]=mg[6][7]=mg[1][1]=mg[6][6]=0; //将入口、出口设置为"0"即可通过;因为距入口或出口一步的路是必经之路,置于0;}(2).递归调用程序代码:void visit(int i, int j) { //访问各个格子,按优先顺序:先右,后下,再左,最后向上int m, n;maze[i][j] = 1;if(i == endI && j == endJ) {printf("\n显示路径:\n");for(m = 0; m < 8; m++) {for(n = 0; n < 8; n++)if(maze[m][n] == 2)printf("□");else if(maze[m][n] == 1)printf("◇");elseprintf(" ");printf("\n");}}if(maze[i][j+1] == 0) visit(i, j+1); //递归调用if(maze[i+1][j] == 0) visit(i+1, j);if(maze[i][j-1] == 0) visit(i, j-1);if(maze[i-1][j] == 0) visit(i-1, j);maze[i][j] = 0;}由于迷宫的设计,老鼠走迷宫的入口至出口路径可能不只一条,如何求出所有的路径呢?求所有路径看起来复杂但其实更简单,只要在老鼠走至出口时显示经过的路径,然后退回上一格重新选择下一个位置继续递回就可以了,比求出单一路径还简单,我们的程式只要作一点修改就可以了。
数据结构实验-迷宫问题数据结构实验迷宫问题在计算机科学领域,数据结构实验是我们深入理解和应用各种数据结构和算法的重要途径。
而迷宫问题,作为一个经典且富有挑战性的课题,不仅能够检验我们对数据结构的掌握程度,还能锻炼我们的逻辑思维和问题解决能力。
迷宫,通常是一个由墙壁和通道组成的复杂网络。
想象一下,在一个封闭的空间里,有无数的岔路和死胡同,我们的目标是从起点找到通往终点的正确路径。
这听起来似乎简单,但当面对实际的迷宫结构时,情况就变得复杂起来。
为了解决迷宫问题,我们首先需要一种合适的数据结构来表示迷宫。
常见的选择是使用二维数组。
我们可以将迷宫中的每个位置表示为数组中的一个元素,用特定的值来表示通道、墙壁或者已经访问过的位置。
接下来,就是选择合适的算法来探索迷宫。
深度优先搜索(DepthFirst Search,简称DFS)和广度优先搜索(BreadthFirst Search,简称 BFS)是两种常用的方法。
深度优先搜索就像是一个勇往直前的探险家,一旦选择了一个方向,就会一直走下去,直到走不通或者到达终点。
它的特点是深入探索,可能会在一条路径上走得很远,但也容易陷入死胡同。
不过,正是这种勇往直前的精神,使得它在一些复杂的迷宫中有可能快速找到一条路径。
广度优先搜索则更加稳健和全面。
它会先逐层地探索迷宫,就像一层一层地剥开洋葱。
从起点开始,先访问距离起点最近的所有节点,然后再逐步向外扩展。
这种方法能够保证找到的路径是最短的,但在计算资源和时间上的消耗可能会相对较大。
在实际的编程实现中,我们需要定义一些辅助的数据结构来记录已经访问过的节点、待访问的节点以及当前的路径等信息。
比如,使用一个栈来实现深度优先搜索,使用一个队列来实现广度优先搜索。
当我们运行算法来解决迷宫问题时,程序会不断地探索各个位置,判断是否是墙壁、是否已经访问过,然后根据搜索策略决定下一步的走向。
这个过程中,会不断地更新迷宫的状态和相关的记录信息。
迷宫游戏试题及答案三年级【试题一】题目:小兔子的回家路描述:小兔子在森林中迷路了,它需要找到回家的路。
请帮助小兔子从起点出发,沿着正确的路径,避开障碍物,最终到达终点。
【答案一】解答:小兔子应该从起点开始,先向上走,然后右转,再向下走,接着左转,最后再向上走,就可以到达终点。
【试题二】题目:宝藏猎人描述:小探险家在一张藏宝图上发现了宝藏的位置,但是需要通过一个复杂的迷宫才能到达。
请帮助小探险家找到最短的路径,从起点到宝藏所在地。
【答案二】解答:小探险家应该从起点出发,先向下走,然后左转,接着向上走,再右转,最后向下走,就可以找到宝藏。
【试题三】题目:逃离城堡描述:小公主被困在城堡里,她需要找到一条通往城堡外的路。
城堡里有许多守卫,小公主需要避开他们才能成功逃离。
【答案三】解答:小公主应该从房间出发,先向左走,然后向上走,接着右转,再向下走,最后再向上走,就可以逃离城堡。
【试题四】题目:寻找神奇药水描述:小魔法师需要找到一种神奇的药水来完成他的魔法实验。
药水藏在一个迷宫里,小魔法师需要找到正确的路径。
【答案四】解答:小魔法师应该从迷宫入口开始,先向下走,然后左转,接着向上走,再右转,最后向下走,就可以找到神奇药水。
【试题五】题目:拯救小猫咪描述:一只小猫咪被困在了一个复杂的迷宫中,它需要找到一条通往自由的路。
请帮助小猫咪从起点出发,避开障碍,最终到达出口。
【答案五】解答:小猫咪应该从起点开始,先向上走,然后右转,再向下走,接着左转,最后再向上走,就可以到达出口。
结束语:通过这些迷宫游戏试题,三年级的小朋友们不仅能够锻炼自己的空间感知能力和逻辑思维,还能在解决问题的过程中获得乐趣。
希望这些试题能激发孩子们的想象力和创造力,让他们在游戏的同时学到知识。
人工智能大作业班级:13111学号:13111姓名:一、问题描述在如图所示的迷宫,找出从起点(1,1)到终点(4,4),要求步数最小.1:初始状态,入口处。
2:目标状态,出口处3:操作方式下上右左二、解题步骤:1:设估价函数:f(n)=g(n)+h(n);g(n)=d(n);h(n)=|Yg-xn|+|Yg-yn|;:2:将迷宫问题转化为格子问题3:按照操作步骤得到状态空间树如下:g=0,h=7,f=7g=1,h=6,f=7g=2,h=5,f=7g=3,h=4,f=7g=4,h=5,f=9 g=4,h=3,f=7g=5,h=2,f=7g=5,h=6,f=11 g=5,h=4,f=9 g=6,h=1,f=7g=6,h=3,f=9 g=7,h=0,f=7g=7,h=2,f=9g=8,h=1,f=9g=9,h=2,f=11,1,11,22,23,23,12,13,33,44,45,416543 287109 4,1 4,2 4,3 5,2 5,15,3 15 1413 121116g=10,h=3,f=134 根据状态空间树得到open表,close表如下:节点父节点f(n)1 无72 1 73 2 74 3 79 4 95 4 76 5 77 6 78 7 716 9 1110 9 911 10 912 11 913 12 914 13 1115 14 13编号节点父节点f(n)8 8 7 77 7 6 76 6 5 75 5 4 74 4 3 73 3 2 72 2 1 71 1 无7根据上表得出路径为s1->s2->s3->s4->s5->s6->s7->s8->sgtracedomainsstate=symboldatabase-mydatabaseopen(state,integer)closed(integer,state,integer)res(state)mark(state)fail_predicatessolvesearch(state,state)resultsearchingstep4(integer,state)step56(integer,state)equal(state,state)repeatresulting(integer)rule(state,state)road(state,state)goalsolve.clausessolve:-search(s0,sg),result.search(Begin,End):-retractall(_,mydatabase),assert(closed(0,Begin,0)),assert(open(Begin,0)),assert(mark(End)),repeat,searching,!.result:-not(fail_),retract(closed(0,_,0)),closed(M,_,_),resulting(M),!.result:-beep,write("sorry don't find a road!").searching:-open(State,Pointer),retract(open(State,Pointer)),closed(No,_,_),No2=No+1,asserta(closed(No2,State,Pointer)),!,step4(No2,State).searching:-assert(fail_).step4(_,State):-mark(End),equal(State,End). step4(No3,State):-step56(No3,State),!,fail.step56(No4,StateX):-rule(StateX,StateY),not(open(StateY,_)),not(closed(_,StateY,_)),assertz(open(StateY,No4)),fail. step56(_,_):-!.equal(X,X).repeat.repeat:-repeat.resulting(N):-closed(N,X,M),asserta(res(X)),resulting(M).resulting(_):-res(X),write(X),nl,fail. resulting(_):-!.rule(X,Y):-road(X,Y).road(s0,s1).road(s1,s2).road(s2,s5).road(s5,s4). road(s4,s7).road(s7,s8).road(s8,s9). road(s9,sg).。
数据结构课程设计大作业20140821班题目迷宫问题专业计算机科学与技术学生姓名姚鑫学号**********指导教师樊艳芬完成日期2016/5/19湖州师范学院信息工程学院目录内容摘要 (1)设计任务与技术要求 (2)总体设计方案 (2)数据结构和算法的设计 (2)程序清单 (3)程序测试与调试 (7)结论与体会 (10)迷宫问题【内容摘要】在一个m行,n列的迷宫中求从入口到出口的一条简单路径,即在求得路径上不能同时重复出现同一通道。
迷宫可用下图所示的方块来表示,每个方块或者是通道(用空白方块表示)或者是墙(用带阴影的方块表示)。
0和1分别表示迷宫中的通道和墙。
输出时简单路径用‘☆’表示,起点用‘入’表示,出口用‘出’表示,墙用‘■’表示,可走的路用‘’表示。
输入m,n,表示m行n列。
再输入m行n列的迷宫(用0和1组成的矩阵表示),再输入迷宫的起点和终点,输出迷宫(含有从起点到终点的简单路径)。
运用了深度优先搜索和递归的相关知识。
【关键字】深度优先搜索,递归【Abstract】Looking for a simple path from the entrance to the exit in a maze of M rows and N columns, that is, the road could not be repeated at the same time in the path. A maze can be shown as diamonds in the following figures. Each diamond is either road or wall. Well , a blank diamond shows the road and a black diamond shows the wall .In the program ,zero represents road ,and one represents wall.When we output,‘☆’represents road, enter stands for starting point ,out stands for exit and ‘■’represents wall. Well, ‘’stands for the way that we can choose.First we should type in m and n. Then type in rows of m and columns of n which can be represented by matrix made of zero and one. In the end, we should type in the starting point and exit.We have learned the information about Depth First Search and recursion.【Key words】Depth First Search,recursion一、实验内容概述(设计任务与技术要求)以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,并把这条通路显示出来,或得出没有通路的结论。
二、实验目的概述(总体设计方案)a)掌握迷宫问题的DFS(深度优先搜索)解法。
b)了解和熟悉深度优先搜索的思路。
c)复习和熟悉二维数组的用法。
d)使用图形来美化输出,使得输出一目了然。
三、解题思路的描述(数据结构和算法的设计)(1)总体思路:先输入迷宫多少行多少列(从1存到n,0行0列以及n+1行n+1列设置为墙用1表示),再输入迷宫的入口和出口,然后递归调用DFS函数(深度优先搜索)来寻找从起点到终点的路线。
在搜索过程中把存迷宫的二维数组中每个点分别置为:0 尚未走过的路1 墙2 路线然后判断是否存在这样一条路线,如果不存在,就输出“不存在从入口到出口的路线”;如果存在,就输出迷宫(包括路线)。
并输出注释。
'☆' means the route' ' means the road'■' means the wall(2)数据结构的选择和描述:选用了int类型数组,数组a用来存储迷宫,结构体Point用来定义入口坐标和出口坐标,x代表横坐标,y代表纵坐标。
flag用来记录dfs时是否找到出口,即退出dfs的标志。
(flag为1时找到出口,为0时没找到)(3)要算法的功能和描述:采用了深度优先搜索(DFS)的思想。
每次搜索的方向依次为右下左上,每搜索一个点就标记为2,若从该点的四个方向进行dfs都无法找到出口,就重新标记为0.;(4)DFS的具体描述:1.传入一个点的横纵坐标,一开始就把传入的存迷宫的这个二维数组节点标记为2(路线),2.判断是否为终点,如果是终点flag标记为1(防止退出DFS时走过的路线被还原0),并跳出DFS函数;否则什么也不做,继续往下运行;3.向右搜索:判断右边相邻的结点是否违反要求(即是否是墙或者越界),如果不违反要求,就把右边相邻的结点传入DFS进行搜索;否则什么也不做,继续运行;判断是否已经找到终点,若已经找到终点(flag==1)直接跳出函数;4.向下搜索:判断下边相邻的结点是否违反要求(即是否是墙或者越界),如果不违反要求,就把下边相邻的结点传入DFS进行搜索;否则什么也不做,继续运行;判断是否已经找到终点,若已经找到终点(flag==1)直接跳出函数;5.向左搜索:判断左边相邻的结点是否违反要求(即是否是墙或者越界),如果不违反要求,就把左边相邻的结点传入DFS进行搜索;否则什么也不做,继续运行;判断是否已经找到终点,若已经找到终点(flag==1)直接跳出函数;6.向上搜索:判断上边相邻的结点是否违反要求(即是否是墙或者越界),如果不违反要求,就把上边相邻的结点传入DFS进行搜索;否则什么也不做,继续运行;判断是否已经找到终点,若已经找到终点(flag==1)直接跳出函数;7.运行到这里还没找到终点表示此路不通,把这点还原为没走过时的样子(重新标记为0);四、源程序清单(源程序中应该附有必要的注释)(1)源程序#include<stdio.h>typedef struct point{int x;int y;}Point; //迷宫中每个点Point start,end; //迷宫的入口与出口int a[40][40]; //输入时迷宫存储的数组int m,n; //m:行 n:列int flag=0; // sign of exit dfs退出的标志void dfs(int x, int y) //深度优先搜索{a[x][y]=2; //表示x行y列这个位置已被走过if((x==end.x)&&(y==end.y)){ //找到了出口flag=1; //退出dfs,防止走过的路线被还原return ;}if((y+1<=n)&&(a[x][y+1]==0)){ //向右搜索dfs(x,y+1);}if(flag){return;}if((x+1<=m)&&(a[x+1][y]==0)){ //向下搜索dfs(x+1,y);}if(flag){return;}if((y-1>=1)&&(a[x][y-1]==0)){ //向左搜索dfs(x,y-1);}if(flag){return;}if((x-1>=1)&&(a[x-1][y]==0)){ //向上搜索dfs(x-1,y);}if(flag){return;}a[x][y]=0; //此路不通,把这点还原为没走过时的样子}int main(){int i,j;printf("请输入多少行多少列:(m,n)(注:输入0 0结束)\n");while(scanf("%d%d",&m,&n)&&(m||n)){ //输入0 0 结束printf("请输入迷宫:(1表示墙 0表示路)\n");for(i=0;i<=m+1;i++){ //输入迷宫for(j=0;j<=n+1;j++){if(i==0||j==0||i==m+1||j==n+1){ //外面置为1,即墙a[i][j]=1;}else{scanf("%d",&a[i][j]);}}}printf("请输入迷宫入口和出口: x1 y1 x2 y2\n");scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y); //输入迷宫入口及出口dfs(start.x,start.y); //深度优先搜索搜索路径if(!flag){printf("不存在从入口到出口的路线\n");}for(i=0;i<=m+1;i++){ //输出结果for(j=0;j<=n+1;j++){if(i==start.x&&j==start.y){ //入口输出美化printf("入");}else if(i==end.x&&j==end.y){ //出口输出美化printf("出");}else if(a[i][j]==1){ //墙输出美化printf("■");}else if(a[i][j]==0){ //路输出美化printf(" ");}else if(a[i][j]==2){ //路线输出美化printf("☆");}}printf("\n"); //换行}printf("'☆' means the route\n"); //注释printf("' ' means the road\n");printf("'■' means the wall\n");}return 0;}(2)算法的时间复杂度是什么?算法的空间复杂度是什么?为什么?答:空间复杂度:线性时间复杂度,具体看最长的那条路径长度。