迷宫问题课程设计论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
本课题主要研究在C语言的基础上用栈和队列两种放过实现求解迷宫,迷宫用一个二维数组来表示。求解迷宫通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前进:否则沿原路退回,换一个方向再继续探索;直至所有可能的通路都探索为止。
关键词:迷宫;栈;队列;二维数组
目录
1问题描述 (1)
2需求分析 (1)
2.1课程设计目的 (1)
2.2课程设计任务 (1)
2.3设计环境 (1)
3概要设计 (2)
3.1数据结构设计 (2)
3.2系统流程图 (4)
4编码与实现 (6)
4.1分析 (6)
4.2具体代码实现 (9)
5测试分析 (17)
6课程设计总结 (18)
参考文献 (19)
致谢 (19)
1问题描述
设计一个简单迷宫程序,从入口出发,按某一方向向前探索,若能走通(未走过的),即某处可以到达,则到达新点,否则试探下一方向;若所有方向均没有通路,则沿原点返回前一点,换下一个方向在继续试探,直到所有可能的通路都探索到,或找到一条通路,或无路可走又返回到入口点。并利用两种方法实现:一种用栈实现,另一种用队列实现。
2 需求分析
2.1课程设计目的
学生在教师指导下运用所学课程的知识来研究、解决一些具有一定综合性问题的专业课题。通过课程设计(论文),提高学生综合运用所学知识来解决实际问题、使用文献资料、及进行科学实验或技术设计的初步能力,为毕业设计(论文)打基础。
2.2课程设计任务
(1)定义一个二维数组存放迷宫数据;
(2)画出查询模块的流程图;
(3)编写代码;
(4)程序分析与调试。
2.3设计环境
(1)WINDOWS 2000/2003/XP/7/Vista系统
(2)Visual C++或TC集成开发环境
3 概要设计
3.1数据结构设计
(1)迷宫类型
设迷宫为M行N列,利用maze[M][N]来表示一个迷宫,maze=0或1,其中0表示通路,1表示不通。当从某点试探是,中间点有8个不同点可以试探,而四个角有3个方向,其他边缘点有5个方向,为使问题更容易分析我们用maze[M+2][N+2]来表示迷宫,而迷宫四周的值全部为1。定义如下:
#define M 6/*迷宫的实际行*/
#define N 8 /*迷宫的实际列*/
int maze[M+2][N+2];
(2)队列的类型定义
队列的有关数据结构、试探方向等和栈的求解方法处理基本相同。不同的是:如何存储搜索路径。在搜索过程中必须几下每一个可到达的坐标点,以便从这些点出发继续向四周搜索。到达迷宫的出口点(m,n)后,为能够从出口沿搜索路径回溯直至入口,对于每一点,记下坐标点的同时,还要记下到达该点的前驱点,因此用一个结构体数组ele[MAX]作为队列的存储空间,因为每一点至少被访问一次,所以MAX 至多等于m*n。该结构体有三个域:x、y和pre。其中x、y分别为所到达点的坐标,pre为前驱点在elem中的下标。除此之外,还需设定头、尾指针,分别指向队头,队尾。类型定义如下:
typedef struct //队的相关类型定义
{ int x,y;
int pre;
}Elemtype;
typedef struct //队列的类型定义
{ Elemtype elem[MAXSIZE];
int front,rear;
int len;
}SqQueue;
(3)队列的相关模块
定义函数DLmazepath( ),利用队列实现迷宫求。
定义函数DLmazepath( ),实现队列的迷宫路径输出。
定义函数I nitQueue(),实现队列的初始化。
定义函数QueueEmpty( ),判断队列是否为空,为空返回1,否则返回0.
定义函数GetHead (SqQueue q,Elemtype *e),实现队头元素的读取。
定义函数EnQueue(SqQueue *q,Elemtype e),实现入队操作。
定义函数DeQueue(SqQueue *q,Elemtype *e),实现出队操作。
定义函数Sprint(int a[M+2][N+2]),实现,迷宫的输出。
定义栈相关的函数见同伴的报告。
3.2 系统流程图
(1)主函数
图3.1 主函数流程图
(2)队列求解迷宫
图3.2 队列求解迷宫流程图
4 编码与实现
4.1分析
(1)主函数
void main()
{
int a,i,j,maze2[M+2][N+2];/*构造一个迷宫*/
int maze[M+2][N+2]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,1,1,1,0,1,1,1,1},
{1,1,0,1,0,1,1,1,1,1},
{1,0,1,0,0,0,0,0,1,1},
{1,0,1,1,1,0,1,1,1,1},
{1,1,0,0,1,1,0,0,0,1},
{1,0,1,1,0,0,1,1,0,1},
{1,1,1,1,1,1,1,1,1,1}};
item move[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
/*坐标增量数组move的初始化*/
为使得程序更加人性化,更加友好,因此可将系统输出界面设置如下:printf(" |*****************迷宫求解系统*****************|\n");
printf(" | 1 、栈方法求解迷宫的路径|\n");
printf(" | 2 、队列求解的迷宫路径|\n");
printf(" | 3、退出系统|\n");
printf(" |*******************************************|\n");
printf("\t\n\n请选择(0-3):"); scanf("%d",&a);
while(a!=3)
{ switch(a)
{ Case 1:Sprint(maze);printf(“路径为:\n");
Zmazepath(maze,move);break;
Case2:Sprint(maze2);printf("路径:\n");
DLmazepath(maze2,move);break;