数据结构迷宫问题课程设计Word文档下载推荐.docx
《数据结构迷宫问题课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构迷宫问题课程设计Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
二.算法设计思想
1.需求分析
(1)迷宫数据用一个二维数组intmaze[row][col]来存储,在定义了迷宫的行列数后,用两个for循环来录入迷宫数据,并在迷宫周围加墙壁。
(2)迷宫的入口位置和出口位置可以由用户自己决定。
2.概要设计
(1)主程序模块:
voidmain()
{
intmaze[row][col];
structmarkstart,end;
细设计
(1)坐标位置类型
structmark{
inta,b;
户使用说明
(1)本程序的运行环境为debug运行环境,执行文件为:
.cpp;
(2)用VC++运行文件后出现以下窗口:
点击
运行程序
(3)出现以下窗口后
输入迷宫的行列数,回车;
再继续输入迷宫的数据,1表示障碍,0表示通路;
再输入入口坐标和出口坐标,回车。
就可以显示出迷宫路径。
2.测试结果
(1)输入行列数:
5,5
输入迷宫数据为:
00011
11011
00010
01100
00000
出口位置:
1,1
(2)输入行列数:
4,9
000000100
010001000
001110011
001110100
输入入口坐标:
输入出口坐标:
(3)输入行列数:
9,8
00100010
00100010
00001101
01110010
00010000
01000101
01111001
11000101
11000000
3.调试分析
(1)在刚开始写完代码后,运行发现程序只能运行简单的一条直线的迷宫,在运行复杂的迷宫时,不会碰到死路(周围没有可探索的道路)就删除坐标往回到前坐标换方向探索。
最后我和同寝室同学一起探讨才发现程序中探索过的坐标没有标记,后来我将maze[x][y]=2将它作为标记才解决问题。
(2)程序中主要的两个算法:
initmaze和maze_path的时间复杂度为O(m*n),空间复杂度也为O(m*n)。
五.总结(收获与体会)
通过这段时间的课程设计,我对数据结构和C语言的理解更加深刻了。
在实践过程中我遇到了不少问题,但通过阅读相关书籍、求问老师同学,最终也解决了不少问题。
这些问题也给了我相当多的收获。
但通过这段时间的学习和解决的这么多问题,我觉得我对这些知识的掌握比以前好了许多。
求解迷宫问题用的是“穷举求解”的方法。
从入口出发,沿着某一方向探索(这里我选择优先探索的是东面),若无障碍,继续往前走,否则眼原路返回,换个方向继续探索,直到将所有可能的通道都探索完为止。
所以需要用栈来保存从入口到当前位置的路径。
但因为之前在学习栈这一节的时候没学扎实,现在有很多知识都忘了。
所以在编写求解迷宫路径的算法的时候我觉得有些困难,后来经过一步步分析和借鉴书上的穷举法才把算法写出来。
但我还是除了许多错误,其中大部分是语法错误,这些最后都还是一一解决了。
而且除了加深了栈的学习,我还复习了以前大一学的C语言中的二维数组和for,while循环。
这次课程设计不仅是让我们加深了解数据结构的理论知识,更重要的是培养我们解决实际问题的能力,能在不断地遇到问题,不断地解决问题的过程中培养自己的专业思维。
所以我相信通过这次课程设计我们能够提升自己的分析、设计程序和编写程序的能力。
六.源程序
#include<
>
#definerow100
#definecol100
};
structelement{
inti,j,d;
//坐标与方向
typedefstructLinkstack{
elementelem;
structLinkstack*next;
}*SLinkstack;
intinitstack(SLinkstack&
L)
L=NULL;
return1;
}
intstack_empty(SLinkstackL)
if(L==NULL)
return1;
else
return0;
intpush_stack(SLinkstack&
L,elementE)
SLinkstackP;
P=(SLinkstack)malloc(sizeof(Linkstack));
P->
elem=E;
next=L;
L=P;
intpop(SLinkstack&
L,element&
E)
if(!
stack_empty(L))
{
E=L->
elem;
P=L;
L=L->
next;
free(P);
}
voidbuilt_maze(intmaze[row][col])//建立迷宫
intx,y;
intm,n;
printf("
请输入迷宫的行列数(用逗号隔开):
"
);
scanf("
%d,%d"
&
m,&
n);
请输入迷宫各行各列的数据(用空格隔开):
\n"
for(x=0;
x<
m+2;
x++)
for(y=0;
y<
n+2;
y++)
{
if(x==0||x==m+1||y==0||y==n+1)//迷宫周围加墙壁
maze[x][y]=1;
else
scanf("
%d"
maze[x][y]);
}
迷宫生成中……\n"
迷宫显示为:
printf("
%3d"
maze[x][y]);
printf("
voidmaze_path(intmaze[row][col],intdir[4][2],structmarkstart,structmarkend)
elementelem,E;
SLinkstackL1,L2;
initstack(L1);
initstack(L2);
maze[][]=2;
//标记起点坐标
=;
=-1;
//d=-1表示无方向
push_stack(L1,elem);
while(!
stack_empty(L1))
pop(L1,elem);
i=;
j=;
d=+1;
//下一个方向
while(d<
4)//探索东西南北各个方向
x=i+dir[d][0];
y=j+dir[d][1];
if(x==&
&
y==&
maze[x][y]==0)
{//这里表示已经到了出口
=i;
=j;
=d;
push_stack(L1,elem);
=x;
=y;
=-1;
while(L1)//逆置序列,输出迷宫路径
{
pop(L1,E);
push_stack(L2,E);
}
while(L2)
pop(L2,E);
printf("
(%d,%d,%d)\n"
,,;
return;
}
if(maze[x][y]==0)
{
maze[x][y]=2;
//标记走过这个点
i=x;
j=y;
d=-1;
d++;
此迷宫无出路"
//出入口的坐标
intdir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
//方向,依次是东西南北
***********************************************************************************************\n"
\t***************欢迎使用迷宫模拟程序***************\n"
built_maze(maze);
请输入入口的横纵坐标:
;
请输入出口的横纵坐标:
0为东,1为南,2为西,3为北,-1为出路\n"
maze_path(maze,dir,start,end);
按任意键继续"
getchar();