1、算法与数据结构课程设计漫步迷宫目 录一、课程设计题目 3二、问题描述 3三、基本要求 3四、设计思想 34.1 函数的功能和参数 34.2存储结构的选择 44.3迷宫有解无解情况的解读 5五、漫步迷宫源程序 5六、运行结果 106.1 主界面 106.2 手动生成迷宫 106.3 自动生成迷宫 13七、设计过程出现的问题和优点 14八、设计的心得体会 17数据结构课程设计-漫步迷宫一、 课程设计题目:漫步迷宫二、 问题描述:用m行n列的m*n个正方格表示一个迷宫,其中划有斜线的方格表示不可通行,未划有斜线的方格表示通行。请编写寻找从入口到出口的一条最短路径的程序。三、 基本要求:1、 迷宫的规
2、则(即行数和列数),状态设置(即各方格能否通行的状态),以及入口和出口的位置,均应由输入随机确定。2、 求得的最短路径,应该以从入口到出口的路径上的各个方格的坐标的线性序列输出。当无通路是,应该报告无路径的信息。3、 尽量采用结构化程序设计方法,要求对各个模块的功能及参数做必要的说明。四、 设计思想4.1 函数的功能和参数 函数参数函数作用pointRow,col,predecessorrow,col,predecessor 分别代表当前位置的行坐标和列坐标,列坐标和移动到下一步的方向creat_mazem,n手动输入迷宫,其中m,n分别为行列的值present_mazem,n自动生成迷宫,其
3、中m,n分别为行列的值present_inm,n,a,b自动生成迷宫的入口,m,n,a,b分别为迷宫的行数、列数、入口的坐标present_outm,n,c,d自动生成迷宫的出口,m,n,c,d分别为迷宫的行数、列数、出口的坐标print_mazem,n,a,b,c,d显示生成的迷宫的图形,m,n,a,b,c,d分别为迷宫的行数和列数、入口坐标和出口坐标result_mazem,n显示最后的迷宫最短路径的路线,m,n分别为路径的各个点的行列数坐标enqueuep为队列函数,实现迷宫的各个点的存储visitrow,col将迷宫当前位置的前后左右四个方向上联通但没有走过的点的值改为2,row,co
4、l分别代表当前位置的行坐标和列坐标mazepathm,n,a,b,c,d实现对迷宫的最短路径的回溯,m,n,a,b,c,d分别为迷宫的行数和列数、入口坐标和出口坐标4.2 存储结构的选择在这个编写的迷宫程序中,我采用的是队列,而没有采用栈这种数据结构。队列将迷宫的每个点都用顺序存储的方式将它存储起来,便于在需找路径是广度优先搜索。首先是将迷宫的各个点的是否通路用0和1表示出来,形成数组,存入到maze这个数组中。当指定一个入口时,首先判断该点是否为通路,若不为通路则直接输出“此迷宫无解”,然后再判断所处位置的前后左右的四个方向上的连通性和是否为出口,连通则记在队列中,若为出口,则停止入队列。在
5、要寻找迷宫路径时,从出口开始回溯查找,将在出口到入口这条路径上的点的值记为3,便于输出迷宫路径。在这个程序中我们要寻找的是迷宫的最短路径,所以要用广度优先搜索,在用广度优先搜索时,每个点都会观察它的前后左右的连通性,每走一步便记录一下,最后走出迷宫的路径便一定是最短的。编写此段程序所用语言为C语言。4.3迷宫的有解和无解的情况解读: 在这个迷宫中会出现无解的情况,特别是在自动生成迷宫的时候,甚至还有自动生成迷宫的入口和出口,在自动生成时,给点的赋值为0或1,每个点连通的情况时一半一半的,这样的概率也就导致了它的无解。无解也就说明了出口和入口不在一个连通分量上。五、 漫步迷宫源程序#includ
6、estdlib.h#includestdio.h#define N 50#define M 50int X;int mazeNM;struct point int row,col,predecessor;queue512;int head=0,tail=0;void creat_maze(int m,int n) int i,j; printf(nn); printf(请按行输入迷宫,0表示通路,1表示障碍:nn); for(i=0;im;i+) for(j=0;jn;j+) printf(maze%d%d:,i,j); scanf(%d,&mazeij); void present_maze
7、(int m,int n) int i,j; printf(n迷宫自动生成中nn); system(pause); for(i=0;im;i+) for(j=0;jn;j+) mazeij=rand()%2;void present_in(int m,int n,int &a,int &b) printf(n迷宫入口自动生成中nn); system(pause); a=rand()%m; b=rand()%n;void present_out(int m,int n,int &c,int &d) printf(n迷宫出口自动生成中nn); system(pause); c=rand()%m;
8、d=rand()%n;void print_maze(int m,int n,int a,int b,int c,int d) int i,j; printf(n迷宫生成结果如下:nn); /printf(迷宫入口n); /printf(); for(i=0;im;i+) printf(n); for(j=0;jn;j+) if(mazeij=0) printf(); if(mazeij=1) printf(); /printf(迷宫出口n);void result_maze(int m,int n) int i,j; printf(迷宫通路(用& 表示)如下所示:nt); for(i=0;i
9、m;i+) printf(n); for(j=0;jn;j+) if(mazeij=0|mazeij=2) printf(); if(mazeij=1) printf(); if(mazeij=3) printf(& ); void enqueue(struct point p) queuetail=p; tail+;struct point dequeue() head+; return queuehead-1;int is_empty() return head=tail;void visit(int row,int col,int maze5050) struct point visit
10、_point=row,col,head-1; mazerowcol=2; enqueue(visit_point);int mazepath(int maze5050,int m,int n,int a ,int b,int c,int d) X=1; struct point p=a,b,-1; if(mazep.rowp.col=1)printf(n*n);printf(此迷宫无解nn);X=0;return 0; mazep.rowp.col=2; enqueue(p); while(!is_empty() p=dequeue(); if(p.row=c)&(p.col=d) break
11、; if(p.row+1m)&(mazep.row+1p.col=0) visit(p.row+1,p.col,maze); if(p.col+1=0)&(mazep.rowp.col-1=0) visit(p.row,p.col-1,maze); if(p.row-1=0)&(mazep.row-1p.col=0) visit(p.row-1,p.col,maze); if(p.row=c&p.col=d) printf(n*n); printf(迷宫路径为:n); printf(%d,%d)n,p.row,p.col); mazep.rowp.col=3; while(p.predeces
12、sor!=-1) p=queuep.predecessor; printf(%d,%d)n,p.row,p.col); mazep.rowp.col=3; else printf(n*n); printf(此迷宫无解!nn);X=0; return 0;void main()int i,m,n,a,b,c,d,j,cycle=0;while(cycle!=(-1)printf(*n);printf( 2011-2012学年第二学期数据结构课程设计 n);printf( -漫步迷宫 n);printf( 开发员:曾祥柯 n);printf( 班 级:10计算本1班 n);printf( 学 号:1015023129 n);printf( 欢迎进入漫步迷宫 n);printf(*n);printf( 手动生成迷宫 请按:1n);printf( 自动生成迷宫 请按:2n);printf( 退出漫步迷宫 请按:3nn);printf(*n);printf(n);printf(请选择你的操作:n);scanf(%d,&i);switch(i) case 1:prin
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1