数据结构课程设计——迷宫问题课程设计报告
数据结构课程设计――迷宫问题课程设计报告

数据结构课程设计――迷宫问题课程设计报告迷宫问题——王欣歆20080564一(需求设计:以一个m*m 的方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口的通道,或得出没有通路的结论。
二(概要设计:存储结构:采用了数组以及结构体来存储数据,在探索迷宫的过程中用到的栈,属于顺序存储结构。
/*八个方向的数组表示形式*/int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1, 1}};/*用结构体表示位置*/struct position{int x,y;};position stack[m*m+1];基本算法:走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、东南、南、西南、西、西北、北、东北8个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果8个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。
每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。
用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。
迷宫的入口点在位置(1,1)处,出口点在位置(m,m)处。
设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。
二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的边界;第1行第1列元素和第m行第m列元素置成“0”,表示迷宫的入口和出口;其余元素值用随机函数产生。
假设当前所在位置是(x,y)。
沿某个方向前进一步,它可能到达的位置最多有8个。
如果用二维数组move记录8个方向上行下标增量和列下标增量,则沿第i个方向前进y 一步,可能到达的新位置坐标可利用move数组确定: o x=x+move[i][0]y=y+move[i][1]从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。
数据结构课程设计报告-迷宫求解

数据构造课程设计陈述------迷宫问题求解学号:1315925375姓名:刘晓龙班级:13移动1班指点先生:钱鸽目次一.需求剖析1二.数据构造21. 数据构造设计斟酌22. 逻辑构造存储构造3三.算法设计3四.调试剖析8五.程序实现及测试8六.领会及缺少之处9七.参考文献9八.源代码10一.需求剖析本课程设计是解决迷宫求解的问题,从进口动身,顺某一偏向向前摸索,若能走通,则持续往前走;不然沿原路退回,换一个偏向再持续摸索,直至所有可能的通路都摸索到为止.为了包管在任何地位上都能沿原路退回,显然须要用一个落后先出的构造来保管从进口到当前地位的路径.是以,在求迷宫通路的算法中要运用“栈”的思惟假设“当前地位”指的是“在搜刮进程中的某一时刻地点图中某个方块地位”,则求迷宫中一条路径的算法的根本思惟是:若当前地位“可通”,则纳入“当前路径”,并持续朝“下一地位”摸索,即切换“下一地位”为“当前地位”,如斯反复直至到达出口;若当前地位“不成通”,则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他偏向持续摸索;若该通道块的周围4个方块均“不成通”,则应从“当前路径”上删除该通道块.所谓“下一地位”指的是当前地位周围4个偏向(上.下.左.右)上相邻的方块.假设以栈记载“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”.由此,“纳入路径”的操纵即为“当前地位入栈”;“从当前路径上删除前一通道块”的操纵即为“出栈”.二.数据构造1. 数据构造设计斟酌1) 树立一个二维数组暗示迷宫的路径(0暗示通道,1暗示墙壁);2) 创建一个栈,用来存储“当前路径”,即“在搜刮进程中某一时刻地点图中某个方块地位”.2. 逻辑构造存储构造1) 创建一个Int类型的二维数组int maze[n1][n2],用来存放0和1 (0暗示通道,1暗示墙壁);2) 创建一个构造体用来储存数组信息构造体:typedef struct//迷宫内部设置{int shu[16][16];int row;int col;}Maze;创造一个链栈struct node{int row;int col;struct node *next;};三.算法设计起首,创建数组的大小,此数组大小请求用户本身输入.具体算printf("输出神宫的外形!\n");scanf("%d%d",&x,&y);Maze m;CreatInit(&m,x,y);函数:void CreatInit(Maze *m,int x,int y)//创建迷宫{printf("please input number:\n");int i,j;for(i=0;i<=x;i++){for(j=0;j<=y;j++)m->shu[i][j] = 2;}for(i=1;i<=x;i++)for(j=1;j<=y;j++)scanf("%d",&m->shu[i][j]);m->row = x;m->col = y;}个中的0和1分离是暗示通路和障碍,界说的数组其实就是迷宫的其次,产生迷宫,算法:for(i=1;i<=x;i++){for(j=1;j<=y;j++)printf("%d\t",m.shu[i][j]);printf("\n");}最后,迷宫寻路,在寻路的时刻,我们应从输入的进口地位进出神宫,当迷宫的进口处有障碍或者出口被堵,再或者没有通路时全部程序停止,并输出迷宫无解的提醒.假如迷宫求解进程中没有消失无解情形,那么在求解的进程中,会输出迷宫的通路路径,并且输出坐标值,让运用者更清晰路径的走法.在寻路的进程中,每走过一个格,谁人格得知就会被赋值为-1,用来标识表记标帜此处已走过,免除了来往返回的重走,以免消失逝世轮回,如许程序就能从进口进入到迷宫当中.假如在迷宫当中没有通路的话,可以停止轮回输出“迷宫无解!”,则当迷宫假如消失有解时,就会输出路径.如许就简略的实现了,有解无解的输出.从而实现了请求的程序!代码如下:while((x1 >= 1 && x1 <= x) || (y1 >= 1 && y1 <= y)){if(x1 == x2 && y1 == y2){break;}if(m.shu[x1][y1+1] == 0 ) {y1=y1+1;push(x1,y1);m.shu[x1][y1] = -1; continue;}if(m.shu[x1-1][y1]==0 ) {x1=x1-1;push(x1,y1);m.shu[x1][y1] = -1; continue;}if(m.shu[x1][y1-1]==0 ) {y1=y1-1;push(x1,y1);m.shu[x1][y1]= -1;continue;}if(m.shu[x1+1][y1]==0 ){x1=x1+1;push(x1,y1);m.shu[x1][y1]= -1;continue;}pop();if(p->next==NULL)break;x1=p->row;y1=p->col;}if(x1 == x2 && y1 == y2){while(p->next != NULL){printf("%d %d\n",p->row,p->col); pop();}}elseprintf("No Answer !!!");个中要追求所有的通路,在这里则运用了一个while轮回,如许可以找到所有的通路.图解剖析:整体流程图:迷宫内部操纵流程图:四.调试剖析第一个问题,在刚开端的调试进程中,我们碰到了,无法断定走过的旅程,从而消失了逝世轮回,导致程序不克不及正常进行,但是经由我们的评论辩论,我们想出用标识表记标帜的办法来解决,也就是让走过的旅程全给标示了,如许就不会再走反复的路.第二个问题,就是性用菜单来实现操纵,那样程序的操纵性就会更强,所以我们就要把所有的办法,给写成一个个的函数来挪用,如许就碰到了参量传递的问题,但是经由我们的参考以及从书本上的实例,我们慢慢地更深的懂得到了参量传递的运用,那么这个问题也就水到渠成了.从此我们实现了菜单操纵!五.程序实现及测试运行界面:开端界面六.领会及缺少之处经由过程此次课程设计,是我对于数据构造有了更深的懂得,更新的熟悉.数据构造是一门主要的课程,只稀有据构造学得扎实了,才干对于盘算机有更深的运用,所以学好数据构造是很主要的.经由两周的上机设计,我实现了简略的迷宫求解,可以或许简略的实现求解进程.但是还消失着缺少之处,本程序不克不及轮回履行,只能履行一次.有待改良!七.参考文献1.《数据构造(c说话版) 》严蔚敏清华大学出版社2.《数据构造试验教程》李业丽.郑良斌《数据构造》高教出版社3.《数据构造习题》李春保清华大学出版社4.《数据构造习题》严蔚敏清华大学出版社5.《C说话与数据构造》王立柱清华大学出版社6.《数据构造(C说话篇)习题与解析》李春保清华大学出版社.八.源代码#include <stdio.h>#include <stdlib.h>typedef struct//迷宫内部设置{int shu[16][16];int row;int col;}Maze;struct node{int row;int col;struct node *next;};struct node *p;void push(int x1,int y1){struct node *a;a=(struct node *)malloc(sizeof(struct node)); a->row=x1;a->col=y1;a->next=p;p=a;}void pop(void){struct node *q;q=p;p=p->next;free(q);}void CreatInit(Maze *m,int x,int y)//创建迷宫{printf("please input number:\n");int i,j;for(i=0;i<=x;i++){for(j=0;j<=y;j++)m->shu[i][j] = 2;}for(i=1;i<=x;i++)for(j=1;j<=y;j++)scanf("%d",&m->shu[i][j]);m->row = x;m->col = y;}void menu(){printf("\n*************************\n"); printf("迎接进出神宫\n");printf("1.进出神宫\n");printf("2.退出\n");}int main(void){int t;int x,y;int x1,y1;int x2,y2;int i,j;while(1){menu();printf("请选择:");scanf("%d",&t);if(t == 2)break;printf("输出神宫的外形!\n");scanf("%d%d",&x,&y);Maze m;CreatInit(&m,x,y);for(i=1;i<=x;i++){for(j=1;j<=y;j++)printf("%d\t",m.shu[i][j]);printf("\n");}printf("输入进口地位:");scanf("%d%d",&x1,&y1);printf("输入出口的地位:");scanf("%d%d",&x2,&y2);p=(struct node *)malloc(sizeof(struct node)); p->row=0;p->col=0;p->next=NULL;push(x1,y1);while((x1 >= 1 && x1 <= x) || (y1 >= 1 && y1 <= y)) {if(x1 == x2 && y1 == y2){break;}if(m.shu[x1][y1+1] == 0 ){y1=y1+1;push(x1,y1);m.shu[x1][y1] = -1;continue;}if(m.shu[x1-1][y1]==0 ){x1=x1-1;push(x1,y1);m.shu[x1][y1] = -1;continue;}if(m.shu[x1][y1-1]==0 ){y1=y1-1;push(x1,y1);m.shu[x1][y1]= -1; continue;}if(m.shu[x1+1][y1]==0 ) {x1=x1+1;push(x1,y1);m.shu[x1][y1]= -1; continue;}pop();if(p->next==NULL) break;x1=p->row;y1=p->col;}if(x1 == x2 && y1 == y2) {while(p->next != NULL) {printf("%d %d\n",p->row,p->col); pop();}}elseprintf("No Answer !!!");}return 0;}。
数据结构课程设计报告-迷宫算法

沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:迷宫算法院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (3)2.2.1 功能模块图 (3)2.2.2 流程图分析 (4)3 数据结构分析 (8)3.1存储结构 (8)3.2算法描述 (8)4 调试与分析 (11)4.1调试过程 (11)4.2程序执行过程 (11)参考文献 (15)附录(关键部分程序清单) (16)1 课程设计介绍1.1 课程设计内容编写算法能够生成迷宫,并且求解迷宫路径(求解出任意一条到出口的路径即可):1.迷宫用上下左右四种走法;2.迷宫的大小和复杂程度可以由用户定义;3.入口出口也由用户自己选择。
1.2 课程设计要求1.不必演示求解过程,只需要输出迷宫求解的路径;2.参考相应资料完成课设。
2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为四大模块。
以下是四个模块的大体分析:1 建立迷宫:要建立迷宫首先就要建立存储结构,这里我用栈的方式建立的。
根据用户输入的迷宫的大小(我设置的最大值为25可以根据要求调解);2 设置迷宫:这里将0设置围墙,1是可以通过的路径,-1是不可以通过路径,外墙是以设计好的,内墙需要用户来设置,障碍的难度可由用户自行定义;3 寻找路径:寻找路径我设置了四个方向{0,1},{1,0},{0,-1},{-1,0}移动方向,依次为东南西北,首先向东走,若不成功则转换方向,成功则继续前进,将走过的路径进行标记,然后存入栈中;4 输出结果:输出的结果分为两种,一种是用户建立的迷宫主要是让用户检查是否符合要求,第二种输出的是寻找完后的路径,路径用1 2 3 4···来表示。
数据结构-迷宫实验报告

数据结构-迷宫实验报告数据结构-迷宫实验报告1.引言1.1 背景迷宫是一个有趣又具有挑战性的问题,它可以用于测试和评估不同的搜索算法和数据结构。
在这个实验报告中,我们将使用不同的数据结构和算法来解决迷宫问题。
1.2 目的本实验的目的是比较使用不同数据结构和算法解决迷宫问题的效率和性能。
我们将尝试使用栈、队列和递归等方法进行迷宫的搜索。
2.方法2.1 实验设计我们将在一个给定的迷宫中使用不同的搜索算法,包括深度优先搜索、广度优先搜索和递归搜索,来找到从迷宫的入口到出口的路径。
我们还将使用栈和队列数据结构来实现这些搜索算法。
2.2 实验步骤1) 定义迷宫的结构,并初始化迷宫的入口和出口。
2) 使用深度优先搜索算法找到迷宫中的路径。
3) 使用广度优先搜索算法找到迷宫中的路径。
4) 使用递归算法找到迷宫中的路径。
5) 比较不同算法的性能和效率。
6) 记录实验结果并进行分析。
3.结果与分析3.1 实验结果在我们的实验中,我们使用了一个10x10的迷宫进行测试。
我们比较了深度优先搜索、广度优先搜索和递归算法的性能。
深度优先搜索算法找到的最短路径长度为14步,搜索时间为0.15秒。
广度优先搜索算法找到的最短路径长度为14步,搜索时间为0.18秒。
递归算法找到的最短路径长度为14步,搜索时间为0.12秒。
3.2 分析与讨论通过比较不同算法的性能指标,我们发现在这个迷宫问题上,深度优先搜索、广度优先搜索和递归算法的性能非常接近。
它们在找到最短路径的长度和搜索时间上都没有明显差异。
4.结论与建议根据本次实验的结果,我们可以得出以下结论:●深度优先搜索、广度优先搜索和递归算法都可以成功解决迷宫问题。
●在这个具体的迷宫问题上,这些算法的性能差异不大。
在进一步研究和实验中,我们建议考虑更复杂的迷宫结构和更多的搜索算法,以探索它们在不同情况下的性能差异。
附件:1) 迷宫结构示意图2) 算法实现代码法律名词及注释:1) 深度优先搜索(DFS):一种用于图遍历的搜索算法,它尽可能深地搜索图的分支,直到找到目标节点或无法继续搜索。
数据结构迷宫求解课程设计报告

课程设计报告课程名称:数据结构报告题目:迷宫求解学生姓名:XX所在学院:信息科学与工程专业班级:软件工程学生学号:XXXXXXXXXXX指导教师:XXX课程设计任务书摘要本程序主若是求迷宫中从人口到出口的所有途径是一个经典的程序设计问题。
运算机解迷宫时,通经常使用的是“穷举求解”的方式,即从入口动身,顺某一方向向前探讨,假设能走通,那么继续往前走;不然沿原路返回,换一个方向在继续探讨,直至所有可能的通路都探讨完为止。
当前位置“可通”,那么纳入“当前途径”,并继续朝“下一名置”探讨,即切换为“下一名置”为“当前位置”,如此重复直至抵达出口;假设当前位置“不可通”,那么应顺着“来的方向”退回到“前一通道块”,假设该通道块的周围4个方块均“不可通”那么应从当前途径删除该通道块。
所谓“下一名置”指的是“当前位置”周围4个方向(东、南、西、北)上相邻的方块。
以栈S来记录“当前途径”,那么栈顶中寄存的是“当前途径上最后一个通道块”。
因此即为“当前途径入栈”;“从当前途径上删除前一通道块”为“出栈”。
在那个进程中能够输出迷宫所走通的途径,在这次课程设计中迷宫是由数组预先概念好的,不能由用户概念生成,能够加入随机函数,自动生成二维数组,还能够用户自己输入迷宫。
关键词:栈;存储结构;数组目录目录 (3)一、课题分析 (1)二、需求分析 (1)1. 主模块功能描述 (1)2. 子程序模块设计 (1)三、设计方案 (1)1.类设计 (1)int point_x; 序模块设计 (2)设计方案与实施与整体设计思想 (2)3. 主模块 (3)子模块 (4)主菜单 (5)功能A模块 (5)功能B模块 (5)功能C模块 (6)四、详细设计 (7)1.用结构体构建栈 (7)SElemType *top; 建类 (7)int point_x; 数组构建一个迷宫 (7)case 1: 戏移动操纵指令 (8)}戏移动操纵指令四个方向的实现 (8)else if ((map[point_x - 1][point_y] == 0 && direction != 5) || map[point_x - 1][point_y] == 3) 戏移动进程中假设是未找到通路,需要返回的指令 (9)}戏的主循环 (9)}戏的开始于终止 (10)if (map[point_x][point_y] == 3) 宫地图的查看与通关后的途径查询 (10)五、设计总结 (11)结论与心得 (11)五、参考文献 (12)一、课题分析(1)该题目为迷宫求解。
数据结构课设--迷宫

数据结构课设--迷宫沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:迷宫算法院(系):计算机学院专业:计算机科学与技术班级:84010103学号:2022040101061姓名:李雪城指导教师:丁一军沈阳航空航天大学课程设计报告目录1课程设计介绍............................................................. ...............................................21.1课程设计内容............................................................. ..........................................21.2课程设计要求............................................................. ..........................................22课程设计原理............................................................. ...............................................22.1课设题目粗略分析............................................................. ..................................22.1.1迷宫的建立............................................................. .......................................22.1.2迷宫的存储............................................................. .......................................22.1.3迷宫路径的搜索............................................................. ...............................22.2原理图介绍...........................................................................................................32.2.1功能模块图............................................................. .......................................32.2.2流程图分析............................................................. ......................................33数据结构分析............................................................. ...............................................53.1概要设计............................................................. ...................................................53.1.1本程序设计思路............................................................. ..............................53.1.2本程序包含的函数............................................................. ..........................53.2详细设计............................................................. ..................................................53.2.1节点类型和指针类型............................................................. .......................53.2.2迷宫的操作............................................................. ......................................53.2.3输出结果............................................................. ...........................................74调试与分析............................................................. ...................................................84.1调试分析............................................................. ..................................................84.2测试结果............................................................. ................................................84.2.1当输入的行列数超过预设范围............................................................. .......84.2.2当输入的行列数未超过预设范围................................................................9参考文献............................................................. ...........................................................10附录(关键部分程序清单)........................................................... (11)1课程设计介绍1.1课程设计内容编写算法能够生成迷宫,并求解迷宫的路径(求解出任意一条到出口的路径即可)。
数据结构课程设计报告迷宫问题队列

题目:迷宫问题(队列)以一个m*n的长方阵表示迷宫,0和1别离表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
要求:第一实现一个以链表作存储结构的队列,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向,如:关于以下数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(3,2,3),(3,1,2),…。
测试数据:迷宫的测试数据如下:左下角(1,1)为入口,右下角(8,9)为出口。
选做内容:(1)编写递归形式的算法,求得迷宫中所有可能的通路;(2)以方阵形式输出迷宫及其通路一、问题分析和任务概念:从题目可知,迷宫问题主若是考察队列操作和图的遍历算法。
能够分解成以下几个问题:1.迷宫的构建,假设是一个个的将数据输入,那么一个m*n的二维数组要想快速的输入进去是很麻烦的,那么就应该让运算机自动生成一个如此的迷宫。
2.题目要求以链表作存储结构的对列来对访问过的通路结点进行存储,如此就会碰到一个比较大的问题。
那确实是,在寻觅的进程当中,当前队尾节点的其余三个方向上均都是墙,如此就无法再走下去了,必需要返回。
由于是用队列存储的,不能直接将队尾元素删除,那就应该让其他元素从队头出队组成另外一条队列。
如此,就能够够将该结点从队列当中删除。
3.在题目中提出,要输出通过结点的方向,关于任意的一个位置有四个方向,因此关于队列中的么每一个结点设置一个方向的标记量,表示走向下一结点的方向,当前加到队尾的元素的方向设置为0,一旦有新元素入队,就对队尾元素的方向进行修改。
4.确信没有通路的思路:因为当沿着每一个方向前进到某一名置时,再也不有通路以后,就会把该节点从队列中删除,同时会将该位置上的值修改,从而保证下次改位置上的结点可不能再入队。
若是不存在通路,必然会一直返回到初始状态(队列为空)。
迷宫课程设计报告

目录引言 (1)一.设计目的 (2)二.问题描述 (2)三.需求分析 (3)四.设计 (3)五.测试分析 (5)六.完整代码 (10)七.设计体会与小结 (17)八、成绩: (17)引言数据结构的学习过程,是进行复杂程序设计的训练过程,是算法构造性思维方法的训练过程,技能培养的过程不亚于知识传授。
数据结构课程教学的重要内容和主要难点在于让我们理解、习惯算法构造性思维方法。
培养我们的数据抽象能力、算法设计能力以及创造性思维方法,才能够举一反三、触类旁通,从而达到应用知识解决复杂问题的目的。
数据结构作为专业基础课程,可以对去年学习的c语言知识进行总结提高,为后续专业基础课程提供基础,它承上启下,贯通始终,是计算机科学与技术人才素质框架中的脊梁,对我们能力的培养至关重要。
通过对数据结构的学习,我们能够以问题求解方法、程序设计方法及一些典型的数据结构算法为对象,学会分析数据对象特征,掌握数理算法,初步掌握算法的时间、空间复杂分析基础,培养良好的程序设计风格以及进行复杂程序设计的技能。
一.设计目的这次课程设计,我们的题目是迷宫求解。
迷宫求解是数据结构中的经典问题,我期望达到的目的有以下4个。
1.巩固书本知识,对书上的知识能更透彻的了解.通过自己设计程序积累调试数据结构的经验,培养我们的编程能力。
巩固我们所学的数据结构知识,消化课堂所讲解的内容。
也是对所学知识的整理,将原来在我们脑中比较混乱的课程设计重新梳理。
2.通过课程设计能更好的掌握迷宫求解中的设计思路,为以后灵活运用奠定基础。
3.能够独立的完成简单程序的设计以及完成一份较为满意的程序设计报告。
4.通过课程设计达到增强巩固数据结构知识的目的,使知识全面化、系统化。
二.问题描述迷宫问题来源于古希腊的神话,而后被人们演化为一个游戏。
以一个N*M的方正表示迷宫,0、1分别表示迷宫中的通路和障碍。
设计一个程序对任意设定的迷宫求出一条从入口的通道,或者的出没有通路的结论。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
迷宫问题
——王欣歆20080564 一.需求设计:以一个m*m 的方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口的通道,或得出没有通路的结论。
二.概要设计:
存储结构:
采用了数组以及结构体来存储数据,在探索迷宫的过程中用到的栈,属于顺序存储结构。
/*八个方向的数组表示形式*/
int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1, 0},{-1, 1}};
/*用结构体表示位置*/
struct position
{
int x,y;
};
position stack[m*m+1];
基本算法:
走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、东南、南、西南、西、西北、北、东北8个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果8个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。
每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。
用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。
迷宫的入口点在位置(1,1)处,出口点在位置(m,m)处。
设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。
二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的边界;第1行第1列元素和第m行第m列元素置成“0”,表示迷宫的入口和出口;其余元素值用随机函数产生。
假设当前所在位置是(x,y)。
沿某个方向前进一步,它可能到达的位置最多有8个。
如果用二维数组move记录8个方向上行下标增量和列下标增量,则沿第i个方向前进一步,可能到达的新位置坐标可利用move数组确定:
x=x+move[i][0]
y=y+move[i][1]
从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。
在搜索过程中,每前进一步,在所到位置处做标记“”
(表示这个位置在通路上),并将该位置的坐标压入栈中。
每次后退的时候,先将当前所在位置处的通路标记“”改
成死路标记“×”(表示这个位置曾到达过但走不通,以后
不要重复进入),然后将该位置的坐标从栈顶弹出。
678
51
432
x
y o
搜索到出口位置时,数组中那些值为“”的元素形成一条
通路。
三.详细设计:
源程序:
/*
迷宫问题
走迷宫的过程可以模拟为一个搜索的过程:每到一
处,总让它按东、东南、南、西南、西、西北、北、东北
个方向顺序试探下一个位置;如果某方向可以通过,并且不
曾到达,则前进一步,在新位置上继续进行搜索;如果个
方向都走不通或曾经到达过,则退回一步,在原来的位置上
继续试探下一位置。
每前进或后退一步,都要进行判断:若前进到了出
口处,则说明找到了一条通路;若退回到了入口处,则说明
不存在通路。
用一个字符类型的二维数组表示迷宫,数组中每个元素
取值“0”(表示通路)或“1”(表示墙壁)。
迷宫的入口点在
位置(1,1)处,出口点在位置(m,m)处。
这个算法,为
其寻找一条从入口点到出口点的通路。
*/
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<time.h>
int main()
{
int m=1;
while (m!=0){
printf("输入m,使得为m*m的方阵迷宫(m>0 输入0 时退出:)\n");
scanf ("%d",&m);
/*设定n*n的方阵迷宫*/
/*数组的形式表示八个方向*/
int move[8][2]={{0,1},{1,1},{1,0},
{1,-1},{0,-1},{-1,-1},{-1, 0},{-1, 1}};
/*用结构体表示位置*/
struct position
{
int x,y;
};
/*用于记录和输出迷宫探路中相关符号,包括1 .*/
char maze[m+2][m+2];
/*用栈来存储探路过程中的数据*/
position stack[m*m+1];
int top;/*栈顶*/
int i,x,y,ok;
position p;
/*二维数组的第0行、第m+1行、第0列、第m+1列元素全
置成"1",表示迷宫的边界;第1行第1列元素和第m行第m列元素置成"0",表示迷宫的入口和出口;其余元素值用随机
函数产生。
*/
srand(time(0));
for(x=1;x<=m;x++)
for(y=1;y<=m;y++)
maze[x][y]=48+rand()%2;
maze[1][1]='0';maze[m][m]='0';
for(x=0;x<=m+1;x++)
{
maze[x][0]='1';maze[x][m+1]='1';
}
for(y=0;y<=m+1;y++)
{
maze[0][y]='1';maze[m+1][y]='1';
}
p.x=1;p.y=1;
top=1;stack[top]=p;
maze[1][1]='.';
/*开始探路
走迷宫的过程可以模拟为一个搜索的过程:每到一
处,总让它按东、东南、南、西南、西、西北、北、东北
个方向顺序试探下一个位置;如果某方向可以通过,并且不
曾到达,则前进一步,在新位置上继续进行搜索;如果个
方向都走不通或曾经到达过,则退回一步,在原来的位置上
继续试探下一位置。
每前进或后退一步,都要进行判断:若前进到了出
口处,则说明找到了一条通路;若退回到了入口处,则说明
不存在通路。
*/
do{
p=stack[top];
ok=0;i=0;
while((ok==0)&&(i<8))
{
x=p.x+move[i][0];
y=p.y+move[i][1];
if(maze[x][y]=='0')
{
p.x=x;p.y=y;
stack[++top]=p;
maze[x][y]='.';
ok=1;
}
i++;
}
if(i==8)
{
maze[p.x][p.y]='*';
top--;
}
}while((top>0)&&((p.x!=m)||(p.y!=m)));
/*输出探路结果*/
if(top==0) printf("没有路径\n");
else printf("有路径\n");
/*输出探路迷宫留下的踪迹*/
for(x=1;x<=m;x++)
{
printf("\n");
for(y=1;y<=m;y++)
printf("%c ",maze[x][y]);
}
printf("\n");
system("pause");
}
}
四.调试分析:
测试数据和结果:
算法时间复杂度:
O(m²)
对相关问题的思考:
这个迷宫问题的算法中,要在开始设置迷宫的大小。
在探索迷宫路线的过程中,是通过不断的尝试来得到最终的结果,由于不能对已经设定为可走路径进行返回,所以在这个算法中有时候可能不能得到走出迷宫的路径。
如下:。