迷宫求解Word文件下载.docx
- 文档编号:19456633
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:17
- 大小:151.05KB
迷宫求解Word文件下载.docx
《迷宫求解Word文件下载.docx》由会员分享,可在线阅读,更多相关《迷宫求解Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
否则沿原路退回,换一个方向继续探索,直到所有可能的通路都探索为止。
给出迷宫的入口和出口及相关的通路,求出从入口到出口的路径。
要求使用C语言编程,定义合适的数据结构。
最后,需要说明设计思想,同时给出能够运行的源程序,并给出对应的程序流程图。
使用一个二维数组来表示迷宫,其中分别用1、0表示通与不通;
算法的基本思想是:
若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复,到达出口;
若当前位置“不可通”,则应顺着“来向”退回到“前一通道块”,然后朝“来向”之外的其它方向探索。
若该通道块四周4个方块均“不可通”,则应从“当前路径”中删除该通道块。
使用栈结构记录当前路径,当前位置入栈表示向前行,出栈则表示从当前位置退回。
2.2运行环境
(1)WINDOWS2000/2003/XP/7/Vista系统
(2)VisualC++6.0
2.3开发工具
C语言
3分析和设计
3.1系统分析及设计思路
本课程设计是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;
否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。
为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。
因此,在求迷宫通路的算法中要应用“栈”的思想假设“当前位置”指的是“在搜索过程中的某一时刻所在图中某个方块位置”,则求迷宫中一条路径的算法的基本思想是:
若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复直至到达出口;
若当前位置“不可通”,则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;
若该通道块的四周4个方块均“不可通”,则应从“当前路径”上删除该通道块。
所谓“下一位置”指的是当前位置四周4个方向(东、南、西、北)上相邻的方块。
假设以栈S记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。
由此,“纳入路径”的操作即为“当前位置入栈”;
“从当前路径上删除前一通道块”的操作即为“出栈”。
3.2主要数据结构及算法
3.2.1数据结构设计考虑
1)建立一个二维数组表示迷宫的路径(0表示通道,1表示墙壁);
2)创建一个栈,用来存储“当前路径”,即“在搜索过程中某一时刻所在图中某个方块位置”。
3.2.2逻辑结构存储结构
1)创建一个Int类型的二维数组intmaze[n1][n2],用来存放0和1(0表示通道,1表示墙壁);
2)创建一个结构体用来储存数组信息(数组的横坐标X,数组的纵坐标Y,方向C)结构体:
typedefstructnode
{
intx;
inty;
intc;
}linkstack;
3)创造一个栈包括(top表示栈顶元素)
linkstacktop[n1*n2];
3.2.3主要算法
首先,创建数组的大小,此数组大小要求用户自己输入。
具体算法:
printf("
输入迷宫大小(提示:
行列数不能超过50!
):
"
);
//在此提示用户输入数组大小的界限
scanf("
%d"
&
g);
//再次用scanf来输入使用者要创建的迷宫大小,并且把值赋给g这个参量,用于对与迷宫数组的创建
大小创建完毕,请输入迷宫:
\n"
//用来提示用户要进行下面操作
其次,用户自己定义迷宫的内容(其中自定义迷宫入口(1,0),迷宫的出口为(g-2、h-1)),迷宫的生成算法:
voidshuzu(intg,inth){//创建数组函数,设定参量并从主函数中获得要使用的参量
inta,b;
for(a=0;
a<
g;
a++)
for(b=0;
b<
h;
b++)
maze[a][b]);
}//使用循环来给数组赋值,也就是用来创建迷宫的格式,这是一个自定义的迷宫创建,其中的0和1分别是表示通路和障碍,定义的数组其实就是迷宫的设计图
第三,产生迷宫(其中自定义迷宫入口(1,0),迷宫的出口为(g-2、h-1)),算法:
voidscsu(intg,inth){//创建迷宫输出函数,设定参量并从主函数中获得要使用的参量
inta,b;
生成的迷宫是:
//提示要现实的内容是什么
{for(b=0;
printf(maze[a][b]?
#"
:
"
//使用循环语句来实现迷宫的实化,输出迷宫
}
最后,迷宫寻路,在寻路的时候,我们应从入口(1、0)进入迷宫,当迷宫的入口处有障碍或者出口被堵,再或者没有通路时整个程序结束,并输出迷宫无解的提示。
如果迷宫求解过程中没有出现无解情况,那么在求解的过程中,会输出迷宫的通路路径,并且输出坐标值,让使用者更清楚路径的走法。
在寻路的过程中,每走过一个格,那个格得知就会被赋值为2,用来标记此处已走过,免去了来来回回的重走,以免出现死循环,所以开始时的入口则直接的定义为了2,这样程序就能达到入口,并从入口进入到迷宫当中,如果在迷宫当中没有通路的话,则会使top[i].c的值变为零,这样当其为0时,可以结束循环输出“迷宫无解!
”,则当迷宫如果出现有解时,则到最后的出口时仍然会将top[i].c赋值为0,但是此时的出口处被复制为2,也就是用这个来判断是否存在通路,所以才实现了图中所示的功能。
这样就简单的实现了,有解无解的输出。
从而实现了要求的程序!
代码如下:
switch(方向)
{case0:
//为0时有两种情况走完全程或者没有通路
{run=0;
if(v==1)//当V为1时说明此路没有走到出口就已经没有路了,所以无通路
printf("
此迷宫无通路!
break;
}
case向右:
{if(maze[top[i].x][top[i].y+1]==0)//用来判断此处是否有障碍
{i++;
top[i].x=top[i-1].x;
top[i].y=top[i-1].y+1;
maze[top[i].x][top[i].y]=2;
//进行赋值交换
if(maze[g-2][h-1]==2)v=0;
//如果在这里结束了那么出口处的坐标值变为2,使V等于0
elsetop[i].c+=1;
//如果没有则进行下一步操作(一下各个方向的操作与第一个方向的相同)
break;
剩余的方向:
case向上:
代码操作与向右一样
case向左:
case向下:
其中要寻求所有的通路,在这里则使用了一个do……while循环,这样可以找到所有的通路,其条件使run。
如果run等于1,则进行循环,否则循环结束程序结束。
另外的,菜单操作(图在测试中)则是使用了switch操作,这样可以选择操作的步骤,如果选择1,则迷宫求解开始,如果选择2则直接结束操作(只有两个操作1:
求解2:
退出)。
3.3函数流程图
图3.3.1主要设计流程图
图3.3.2生成迷宫流程图
图3.3.3详细设计流程图
图3.3.4以二维数组定义迷宫流程图
4具体代码实现
#include<
stdio.h>
stdlib.h>
#definen150//定义行范围
#definen250//定义列范围
typedefstructnode//创建一个结构体存储数组信息
{
intx;
inty;
intc;
}linkstack;
intmaze[n1][n2];
//创建一个二维数组
linkstacktop[n1*n2];
//创建一个N*N的栈
inti,j,k,m=1,run;
voidshuzu(intg,inth){//以二维数组形式定义迷宫内容
for(a=0;
for(b=0;
scanf("
//输入迷宫对应的数组数据
}
voidscsu(intg,inth){//生成迷宫
printf("
{for(b=0;
printf(maze[a][b]?
//输出迷宫图形
voidmain()
{intg,h,v;
intw;
欢迎使用迷宫求解\n"
迷宫求解请按:
1\n"
退出请按:
2\n"
输入您的选择:
w);
switch(w)//若输入的W为1或2,则继续程序
{case1:
//W为1时
h=g;
//确定数组大小为g维
shuzu(g,h);
for(i=0;
i<
=g*h;
i++)
top[i].c=1;
scsu(g,h);
//生成迷宫
i=0;
top[i].x=1;
//i=0时X方向对应值得和为1
top[i].y=0;
//i=0时Y方向对应值得和为0
maze[1][0]=2;
//入口迷宫值变为2
run=1;
v=1;
do{//定义行走规则和出口判断
if(top[i].c<
5)//若i点可到方向值小于5则向下进行
{if(top[i].x==(g-2)&
&
top[i].y==(h-1))//当i点为出口时所满足的条件
{printf("
第%d条通路是:
m++);
//输出不同的路程
for(j=0;
j<
=i;
j++)
{printf("
(%d,%d)"
top[j].x,top[j].y);
}//输出通路坐标
j++)//求出迷宫路线图形
{for(k=0;
k<
k++)
{if(maze[j][k]==0)
elseif(maze[j][k]==2)
O"
elseprintf("
maze[top[i].x][top[i].y]=0;
i--;
top[i].c+=1;
continue;
switch(top[i].c)
{case0:
{run=0;
if(v==1)
break;
case1:
{if(maze[top[i].x][top[i].y+1]==0)
{i++;
top[i].x=top[i-1].x;
top[i].y=top[i-1].y+1;
maze[top[i].x][top[i].y]=2;
if(maze[g-2][h-1]==2)v=0;
elsetop[i].c+=1;
case2:
{if(maze[top[i].x-1][top[i].y]==0)
top[i].x=top[i-1].x-1;
top[i].y=top[i-1].y;
case3:
{if(maze[top[i].x][top[i].y-1]==0)
top[i].y=top[i-1].y-1;
case4:
{if(maze[top[i].x+1][top[i].y]==0)
top[i].x=top[i-1].x+1;
else
{if(i==0)return;
}while(run==1);
欢迎下次使用!
);
default:
5课程设计总结
5.1课程设计结果或预期结果
图5.1.1迷宫通路
图5.1.2迷宫无解
5.2设计结论
通过此次课程设计,是我对于数据结构有了更深的了解,更新的认识。
数据结构是一门重要的课程,只有数据结构学得扎实了,才能对于计算机有更深的应用,所以学好数据结构是很重要的。
经过两周的上机设计,我实现了简单的迷宫求解,能够简单的实现求解过程。
但是还存在着不足之处,不能输入矩形的数组,而且出口和入口是固定的,也可以改变可是要改变代码,本程序不能循环执行,只能执行一次。
有待改进!
对于此次课程设计,我感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。
实验过程中,使我更加扎实的掌握了有关数据结构方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。
在课程设计过程中,我不断发现错误,不断改正,不断领悟,不断获取。
最终的调试运行环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于迎刃而解。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教老师和同学或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获就多。
参考文献
[1]徐孝凯,贺桂英著.C语言教程[M].北京:
清华大学出版社,2004.
[2]张福祥,王萌.C语言程序设计习题解答与实验实训[M].沈阳:
辽宁大学出版社,2008.
[3]黄同成,黄俊民等.数据结构.北京:
中国电力出版社,2008.2
[4]齐德昱.算法与数据结构[M].北京:
清华大学出版社,2003.10.
致谢
这次课程设计让我收获不少,虽然这次我这组的课程设计题目不是很难,但我也花了很多时间去做,认真完成了此次课程设计。
在李仲生老师的指导下,我得以顺利地完成本次课程设计,并努力使设计更加完美。
李老师严谨求实的治学态度,踏实坚韧的工作精神,将使我终生受益。
在此,我要感谢李老师对我的帮助。
谢谢!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 求解