1、数据结构课程设计C+数据结构课程设计 题目:迷宫问题的求解 姓名:安冬辉 学号:20090802310067 班级:09理科实验班 学院:信息科学技术学院 指导老师:任一凡目录一、【问题介绍(Instruction)】 3二、【实验构思(Conceive)】 3三、【实验设计(Design)】 41、设定迷宫的抽象数据类型定义 42、本程序的三个模块 53、迷宫类型 54、栈类型 55、主函数 56、迷宫构造 67、迷宫的显示转换 78、求解迷宫中的一条路径 89、迷宫的输出显示 1110.迷宫的路径显示 11四、【测试结果(Testing)】 121 迷宫存在通路 122 迷宫不存在通路 1
2、5五、【实验总结(Summarize)】 17六、【代码】 18一、【问题介绍(Instruction)】 迷宫问题最早出现在古希腊神话中。据说,半人半兽的英雄西修斯在克里特的迷宫中勇敢地杀死半人半牛的怪物,并循着绳索逃出迷宫。希腊史学家希罗多德曾探访过那里。他描述说,整个迷宫由12座带顶院落构成,所有的院落都由通道连接,形成3000个独立的“室”。后来的参观者也说,一旦进入迷宫,如果没有向导,根本无望走出。历史上,人们认为迷宫具有魔力。后来,迷宫成为游戏。在如今计算机非常普及的情况下,迷宫又以游戏程序的形式呈现在我们日常使用的电脑上。二、【实验构思(Conceive)】(本部分包括:描述实验
3、实现的基本思路,包括所用到的离散数学、程序设计、算法等相关知识) 1、迷宫求解问题,完成时的功能:能在规定的矩阵迷宫中从开始点走到规定的终点;以一个m x n的长方矩阵表示迷宫,1和0分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出从入口到出口的通路,或者没有通路的结论。 2、以二维数组mazeMN表示迷宫,其中maze0j和mazei0(0=j,i=N)为添加的一圈障碍。数组中以元素“1”表示通路,“0”表示障碍,迷宫的大小理论上可以不限制。 3、迷宫数据由程序提供,用户只需要进行选择迷宫就行。迷宫的入口和出口由程序提供。 4、若设定的迷宫存在通路,则以长方形矩阵的形式将迷宫
4、及其通路输出到标准终端上,其中“1”表示障碍,“0”表示通路,“.”表示通过的路径,“+”表示死胡同。 5、本程序只求出一条成功的通路。但是只要对函数进行小量的修改,就可以求出其他全部的路径。 6、程序执行命令为:创建迷宫求解迷宫输出迷宫。 三、【实验设计(Design)】(本部分包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)1、设定迷宫的抽象数据类型定义ADT migong数据对象:D=ai,j|i,j,0=i=M,0=j=N数据关系:R=hang,lie hang=|ai-1,j,ai,j属于D,i=1,2,M,j=0,1,N
5、lie=|ai,j-1,ai,j属于D,i=0,1,M,j=1,2,N基本操作: gouzhaomigong(&maze,hang,lie)初始条件:为二维数组mazeij分配空间,对其中第1至第i-1行,每行自第1到第j-1列的元素进行赋值,并以值0表示障碍,值1表示通路。操作结果:构造迷宫的字符数组,以0表示通路,字符1表示障碍,并自动在迷宫四周加上一圈障碍。 qiujiemigong(&maze,hang,lie) 初始条件:迷宫中的所有坐标都已经被赋值操作结果:若迷宫中该坐标能够通过且已经通过,则标记为.,若不能够通过(死胡同),标记为+。 xianshimigong(maze,han
6、g,lie) 初始条件:迷宫已经存在 操作结果:以字符形式输出迷宫 xianshimigonglujing(maze,hang,lie) 初始条件:迷宫已经存在,已经求解 操作结果:若迷宫通路存在,以字符形式输出迷宫的求解路径,否则输出“次迷宫没有出路”。 danbuxianshi(maze,hang,lie) 初始条件:迷宫已存在 操作结果:显示迷宫求解过程的每一步结果 ADT migong2、本程序的三个模块2.1 主程序模块int main()初始化;构造迷宫;迷宫求解;迷宫输出;2.2 栈模块记录迷宫路径2.3 迷宫模块实现迷宫的抽象数据类型3、迷宫类型typedef struct m
7、igong elemtype mazeij;/迷宫矩阵的坐标值 int hang,lie; /迷宫矩阵的行数、列数migong;4、栈类型 struct step /定义一个栈 int x,y,n; /x,y表示步子坐标,n表示步数 ;5、主函数int main() 变量的定义; gouzhaomigong(&maze,hang,lie); /构造一个迷宫 xianshimigong(migong,hang,lie); /将该构造好的迷宫输出 qiujiemigong(&maze,hang,lie); /探索迷宫 xianshimigonglujing(maze,hang,lie); /输出探
8、索出来的迷宫 danbuxianshi(maze,hang,lie);/单步显示迷宫的路径6、迷宫构造void gouzhaomigong(char *mazeij,int hang,int lie) char *maze; /定义一个迷宫,空间可动态 int hang,lie,i,j; cout请输入矩阵的行列endl; couthang; coutlie; coutendl; maze=new char *hang+2; /分配连续空间给迷宫 for(i=0;ihang+2;i+) mazei=new char lie+2; cout请输入迷宫,0表示通路,1表示墙endl; for(i=
9、1;i=hang;i+) for(j=1;jmazeij; for(i=0;ihang+2;i+) mazei0=1; for(i=0;ilie+2;i+) maze0i=1; for(i=0;ilie+2;i+) mazehang+1i=1; for(i=0;ihang+2;i+) mazeilie+1=1; coutendlendl;7、迷宫的显示转换void change(char *maze,int hang,int lie) /改变以下迷宫的样子,为了单步显示清楚 for(int i=0;ihang+2;i+) for(int j=0;jlie+2;j+) switch(mazeij
10、) case 1: mazeij=#;break;case +:case 0:case .: mazeij= ;break; 8、求解迷宫中的一条路径void qiujiemigong(char *maze,int hang,int lie) int i=1,j=1,n=-1; char Q; step *Step; /定义一个存储路程的栈 Step=new step hang*lie; /事先给其分配一定的空间,hang*lie表示空间足够 if(maze11=1) cout迷宫入口堵住了,无法行走!endlendl; getch(); exit(0); else n+; mazeij=.;
11、 Stepn.x=i; Stepn.y=j; while(mazehanglie!=.) /由右、下、左、上的顺序判断是否走通 /1表示走不通,+表示已经走过但不通又回来的步子,.表示已经走过并通了的步子 if(mazeij+1!=1&mazeij+1!=.&mazeij+1!=+) mazeij+1=.; j=j+1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向右走到: (i,j)endl; else if(mazei+1j!=1&mazei+1j!=.&mazei+1j!=+) mazei+1j=.; i=i+1; n+; Stepn.x=i; Stepn.y
12、=j; cout第n步: 向下走到: (i,j)endl; else if(mazeij-1!=1&mazeij-1!=.&mazeij-1!=+) mazeij-1=.; j=j-1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向左走到: (i,j)endl; else if(mazei-1j!=1&mazei-1j!=.&mazei-1j!=+) mazei-1j=.; i=i-1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向上走到: (i,j)endl; else /若走不通则返回上一步 if(i=1&j=1) /当回到入口时,说
13、明无通路,结束循环 break; else mazeij=+; /将走不通的点置为+ n-; i=Stepn.x; /返回上一个点 j=Stepn.y; cout此路不通!返回至上一步: (i,j)endl; /输出返回信息 if(i=hang&j=lie) cout成功走到出口! 共n步; 9、迷宫的输出显示void xianshimigong(mazeij,int hang,int lie) cout*您输入的迷宫为*endl; cout行数:hang 列数:lie; cout 入口:1,1 出口:hang,lieendl; for(i=0;ihang+2;i+) for(j=0;jlie
14、+2;j+) coutmazeij ; coutendl; 10.迷宫的路径显示void xianshimigonglujing(char *maze,int hang,int lie,int i,int j) /输出所走的路程 if(i=1&j=1) &(hang!=1&lie!=1) /若回到原点则表明无出路 coutendlendl; cout*endl; cout|-此迷宫没有出路,所走路线如下图-|endl; cout*endl; else /否则有出路 coutendlendl; cout*endl; cout|-找到迷宫出路,如图所示-|endl; cout*endl; for(
15、i=0;ihang+2;i+) /输出步子 for(j=0;jlie+2;j+) coutmazeij ; coutendl; 四、【测试结果(Testing)】(本部分包括:对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析总结)1 迷宫存在通路2 迷宫不存在通路五、【实验总结(Summarize)】(本部分应包括:自己在实验中完成的任务;对所完成实验的经验总结、心得)在这次数据结构课程设计中,我的题目是:迷宫问题,通过该题目的设计过程,我加深了对栈的逻辑结构,存储结构及入栈出栈过程的理解,对栈的基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和
16、掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。一个人要完成所有的工作是非常困难和耗时的。在以后的学习中我会更加注意各个方面的能力的协调发展。在课程设计时遇到了很多的问题,在同学的帮助下,各种资料的查阅中,解决问题,培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。六、【代码】(本部分包括:完整的代码及充分的注释)#include #include #include using namespace std;struct step /定义一个栈 int x,y,n; /x,y表示步子坐标,n表示步数;void change(char *maze
17、,int hang,int lie) /改变以下迷宫的样子,就为了好看点 for(int i=0;ihang+2;i+) for(int j=0;jlie+2;j+) switch(mazeij) case 1: mazeij=#;break;case +:case 0:case .: mazeij= ;break; void step_to_step(char *maze,step *Step,int hang,int lie,int n) /单步输出 for(int k=0;k=n;k+) for(int i=0;ihang+2;i+) for(int j=0;jlie+2;j+) if(
18、Stepk.x=i&Stepk.y=j) cout. ; else coutmazeij ; coutendl; cout这是第k步endl; getch(); void out(char *maze,int hang,int lie,int i,int j) /输出所走的路程 if(i=1&j=1) &(hang!=1&lie!=1) /若回到原点则表明无出路 coutendlendl; cout*endl; cout|-此迷宫没有出路,所走路线如下图-|endl; cout*endl; else /否则有出路 coutendlendl; cout*endl; cout|-找到迷宫出路,如图
19、所示-|endl; cout*endl; for(i=0;ihang+2;i+) /输出步子 for(j=0;jlie+2;j+) coutmazeij ; coutendl; void cure(char *maze,int hang,int lie) int i=1,j=1,n=-1; char Q; step *Step; /定义一个存储路程的栈 Step=new step hang*lie; /事先给其分配一定的空间,hang*lie表示空间足够 if(maze11=1) cout迷宫入口堵住了,无法行走!endlendl; getch(); exit(0); else n+; maz
20、eij=.; Stepn.x=i; Stepn.y=j; while(mazehanglie!=.) /由右、下、左、上的顺序判断是否走通 /1表示走不通,+表示已经走过但不通又回来的步子,.表示已经走过并通了的步子 if(mazeij+1!=1&mazeij+1!=.&mazeij+1!=+) mazeij+1=.; j=j+1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向右走到: (i,j)endl; else if(mazei+1j!=1&mazei+1j!=.&mazei+1j!=+) mazei+1j=.; i=i+1; n+; Stepn.x=i; S
21、tepn.y=j; cout第n步: 向下走到: (i,j)endl; else if(mazeij-1!=1&mazeij-1!=.&mazeij-1!=+) mazeij-1=.; j=j-1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向左走到: (i,j)endl; else if(mazei-1j!=1&mazei-1j!=.&mazei-1j!=+) mazei-1j=.; i=i-1; n+; Stepn.x=i; Stepn.y=j; cout第n步: 向上走到: (i,j)endl; else /若走不通则返回上一步 if(i=1&j=1) /当回
22、到入口时,说明无通路,结束循环 break; else mazeij=+; /将走不通的点置为+ n-; i=Stepn.x; /返回上一个点 j=Stepn.y; cout此路不通!返回至上一步: (i,j)endl; /输出返回信息 if(i=hang&j=lie) cout成功走到出口! 共n步; out(maze,hang,lie,i,j); coutendlendlendl; coutQ; coutendl; if(Q=y) change(maze,hang,lie); step_to_step(maze,Step,hang,lie,n); int main() char *maze; /定义一个迷宫,空间可动态 int hang,lie,i,j; cout请输入矩阵的行列endl; couthang; coutlie; coutendl; maze=new char *hang+2; /分配连续空间给迷宫 for(i=0;ihang+2;i+) mazei=new char lie+2; cout请输入迷宫,0表示通路,1表示墙endl; for(i=1;i=hang;i+) for(j=1;jmazeij; for(i=0;ihang+2;i+) mazei0=1; f
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1