数据结构课程设计报告老鼠走迷宫
- 格式:doc
- 大小:414.50 KB
- 文档页数:35
实验报告小鼠走迷宫1. 引言小鼠走迷宫是一种常用的实验手段,用于研究小鼠的学习、记忆以及空间导航能力。
本实验旨在观察小鼠在迷宫中的行为表现,并通过不同条件下的实验设计,探究小鼠的学习能力以及对空间信息的处理能力。
2. 实验设计2.1 实验材料与仪器- 迷宫:采用典型的T型迷宫,包括起始点、两个分岔口和一个奖励点。
- 小鼠:选取健康活泼的C57BL小鼠作为实验对象。
- 实验记录设备:摄像机、计算机等。
2.2 实验步骤1. 将小鼠放置在起始点,并记录下起始时间。
2. 观察小鼠在迷宫中的行为表现,包括选择路径、运动速度等。
3. 当小鼠找到奖励点时,记录下用时并给予奖励。
4. 将小鼠放置在起始点,重复进行多次实验。
5. 对于每个小鼠,计算其平均用时和正确率。
2.3 实验组设计- 对照组:小鼠在未经训练的情况下进行实验,用于比较小鼠的初始表现。
- 训练组:小鼠经过一定训练后进行实验,用于观察小鼠的学习能力。
3. 实验结果与分析通过对多只小鼠进行实验,我们得到了以下结果:实验组平均用时(s) 正确率(%)对照组90 30训练组60 80从实验数据可以看出,对照组小鼠在找到奖励点上花费的时间较长,正确率较低,表明小鼠在未经训练的情况下对迷宫的空间信息处理能力较弱。
而经过训练的小鼠用时较短,正确率较高,表明小鼠在经过一定的学习后,能更好地识别迷宫中的路径和空间信息。
4. 结论与讨论通过本实验的观察和分析,我们可以得出以下结论:1. 小鼠在未经训练的情况下对迷宫的空间信息处理能力较弱。
2. 经过一定的学习训练后,小鼠能够提高其对迷宫空间信息处理的能力。
3. 小鼠的学习能力和对空间信息的处理能力存在个体差异。
这些结论提示我们,在研究小鼠行为和认知能力时,应充分考虑小鼠的训练状态和个体差异,以获得更准确的实验结果。
值得注意的是,本实验存在一些限制。
首先,小鼠的行为表现受到环境等因素的影响,如光照、温度等。
其次,迷宫的设计和布局可能也会对小鼠的表现产生影响。
《数据结构》课程设计3.8 老鼠迷宫姓名: XXX院系: 计算机学院专业: 计算机科学与技术年级: 13级学号: E11314XXX指导教师:XXX2015年 10月 5 日目录1.课程设计的目的 (3)2.需求分析 (3)3走迷宫游戏的设计 (3)3.1概要设计 (3)3.1.1主界面设计 (3)3.1.2存储结构 (3)3.1.3系统功能设计 (4)3.2详细设计 (4)3.2.1系统子程序及功能设计 (4)3.2.2数据类型定义 (5)3.2.3系统主要子程序详细设计 (6)3.3调试分析 (15)3.4用户手册 (16)4总结 (16)5、程序清单:(见附录) (16)7、程序运行结果 (16)附录1 (22)1.课程设计的目的(1) 熟练使用C 语言编写程序,解决实际问题;(2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
2.需求分析(1)程序运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
(2)按动键盘上的方向操作杆控制老鼠在规定的时间内走到粮仓。
(3)老鼠形象可辨认,迷宫的墙足够结实,老鼠不能穿墙。
(4)若老鼠在规定时间走到粮仓处则提示成功,否则提示失败。
(5)添加编辑迷宫功能,可使迷宫墙变路,路变墙。
(6)找出走出迷宫的所有路径,以及最短路径。
3走迷宫游戏的设计3.1概要设计3.1.1 主界面设计图 1主界面,如图1所示,包含六个菜单项,分别是开始游戏、编辑迷宫、读入迷宫、生成随机迷宫、最短路径、退出系统。
输入数字选择对应菜单,进入子项。
3.1.2 存储结构本系统用结构体Maze存储迷宫,该结构体由room[M][N],status[M][N]组成。
room是int型数组,存储迷宫具体内容;status是int型数组,用来存放迷宫求解时通堵状态,迷宫大小M,N固定。
一、实验目的通过本次实验,了解老鼠在迷宫中的运动轨迹,探究其寻找出口的策略,并尝试运用数据结构中的搜索算法来模拟老鼠的行走过程,分析其路径选择的特点。
二、实验原理迷宫问题是一个经典的算法问题,旨在通过模拟老鼠在迷宫中寻找出口的过程,来验证和优化搜索算法。
本实验采用深度优先搜索(DFS)算法来模拟老鼠的运动轨迹,通过堆栈来存储老鼠走过的路径,并记录其最终找到出口的最短路径。
三、实验材料1. 迷宫地图:一个二维数组,表示迷宫的布局,其中0代表无墙、没走过;1代表墙;2代表无墙、已走过。
2. C语言编程环境:用于编写和运行实验代码。
3. 输入设备:用于输入起始点和迷宫地图。
四、实验步骤1. 设计迷宫地图,初始化二维数组map[10][12]。
2. 输入起始点坐标(行列坐标),判断输入是否合法(越界或起始点在墙中)。
3. 初始化一个空堆栈,用于存储老鼠走过的路径。
4. 使用深度优先搜索算法遍历迷宫,寻找出口:a. 将起始点入栈。
b. 标记当前点为已走过。
c. 判断当前点是否为出口,如果是,则输出路径,结束搜索。
d. 找到当前点的后继点(上下左右),如果后继点合法且未走过,则将其入栈并标记为已走过,继续搜索。
e. 如果当前点没有后继点,则回溯,弹出栈顶元素,尝试下一个方向。
5. 输出最短路径,记录老鼠的运动轨迹。
五、实验结果与分析1. 迷宫地图及起始点:```0 1 1 1 1 1 1 1 1 1 1 11 0 0 0 0 0 0 0 0 0 0 11 0 1 1 1 1 1 1 1 1 1 11 0 1 0 0 0 0 0 0 0 0 11 0 1 1 1 1 1 1 1 1 1 11 0 1 0 0 0 0 0 0 0 0 11 0 1 1 1 1 1 1 1 1 1 11 0 0 0 0 0 0 0 0 0 0 11 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1```2. 老鼠起始点坐标:(1, 1)3. 运动轨迹及最短路径:```老鼠运动轨迹:[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (1, 11), (2, 11), (3, 11), (4, 11), (5, 11), (6, 11), (7, 11), (8, 11), (9, 11), (10, 11), (11, 11)]最短路径:[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (1, 11), (2, 11), (3, 11), (4, 11), (5, 11), (6, 11), (7, 11), (8, 11), (9, 11), (10, 11), (11, 11)]```4. 分析:通过实验结果可以看出,老鼠在迷宫中寻找出口的过程主要遵循深度优先搜索策略,即优先探索当前路径的深度,直到找到出口。
《数据结构》课程设计报告(走迷宫)学院:湖南工学院班级学号:姓名:指导教师:完成日期:2011年1月3号目录1.需求分析 (3)2.程序的详细设计 (3)3.调试分析 (8)4.主函数 (9)5.测试 (10)6.心得体会 (12)7.附录 (13)1.需求分析程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使老鼠走到粮仓处。
要求:1)迷宫的墙足够结实,老鼠不能穿墙而过;2)正确检测结果,若老鼠在能走到粮仓处,提示成功,否则提示失败;3)老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;2.程序的详细设计首先,确定迷宫的存储结构,说明位置在迷宫中的行坐标和列坐标。
typedef int Status;typedef struct{int r,c; /*迷宫中位置的坐标*/}PosType;typedef struct{int m,n;char arr[RANGE][RANGE]; /*用二维数组表示迷宫*/}MazeType;第二,确定放入栈中的元素的存储结构,表明通道块在路径上的“序号”,通道块的坐标位置以及下一步要走的方向。
typedef int directiveType;typedef struct{int step;PosType seat; /*当前位置在迷宫中的坐标*/directiveType di; /*从当前位置走到下一位置的方向*/}ElemType;第三,确定栈的存储结构。
typedef struct NodeType{ElemType data;struct NodeType *next;}NodeType,*LinkType;typedef struct{LinkType top; /*链栈的顶点定义*/int size;}Stack;void InitStack(Stack &S) /*构建一个空栈*/{S.top=NULL;S.size=0;}Status MakeNode(LinkType &p,ElemType e){p=(NodeType *)malloc(sizeof(NodeType));if(!p)return FALSE; /*存储分配失败*/p->data=e;p->next=NULL;return TRUE;}定义在什么情况下要入栈Status Push(Stack &S,ElemType e){LinkType p;if(MakeNode(p,e)){p->next=S.top;S.top=p;S.size++;return TRUE;}return FALSE;}判断栈是否为空Status StackEmpty(Stack S) /*若栈为空栈,则返回TRUE,否则返回FALSE*/{if(S.top==NULL)return TRUE;return FALSE;}定义在什么情况下要出栈Status Pop(Stack &S,ElemType &e){LinkType p;if(StackEmpty(S))return FALSE;else{p=S.top;S.top=S.top->next;e=p->data;S.size--;free(p);return TRUE;}}定义什么情况下迷宫可以走Status pass(MazeType maze,PosType curpos) {int m,n;m=curpos.r;n=curpos.c;if(maze.arr[m][n]==' ')return TRUE;return FALSE;}定义什么情况下已经走出了迷宫Status Same(PosType curpos,PosType end){if(curpos.r==end.r && curpos.c==end.c)return TRUE;return FALSE;}定义走通的位置要用*标记void FootPrint(MazeType &maze,PosType curpos) {int m,n;m=curpos.r;n=curpos.c;maze.arr[m][n]='*';}定义在探索过程中老鼠走的方向关系PosType NextPos(PosType curpos,int di){switch(di){case 1:curpos.c++;break;case 2:curpos.r++;break;case 3:curpos.c--;break;case 4:curpos.r--;break;}return curpos;}定义走过但没有走通位置要用@标记void MarkPrint(MazeType &maze,PosType p){maze.arr[p.r][p.c]='@';}void PrintMaze(MazeType ma){int i,j;printf("\n");for(i=0;i<ma.m;i++){printf("\t");for(j=0;j<ma.n;j++){printf("%c ",ma.arr[i][j]);}printf("\n");}printf("\n");}将数组转化为迷宫void InitMaze(MazeType &maze,int a[M][N],int row,int col) {int i,j;maze.m=row;maze.n=col;for(i=0;i<row;i++)for(j=0;j<col;j++){if(a[i][j]==0)maze.arr[i][j]=' ';elsemaze.arr[i][j]='#';}}探索迷宫Status MazePath(MazeType &maze,PosType start,PosType end) {Stack s;int curstep=1; //探索第一步Status found=FALSE;ElemType e;PosType curpos=start; //设定当前位置为入口InitStack(s);do{if(pass(maze,curpos)) //当前位置可以通过,即是未曾走过的通道块{FootPrint(maze,curpos); //留下足迹{e.step=curstep;e.seat=curpos;e.di=1;}Push(s,e); //加入路径if(Same(curpos,end))// 到达终点{found=TRUE;}else{curpos=NextPos(curpos,1); //下一位置是当前位置的北邻curstep++; //探索下一步}}else //当前位置不能通过if(!StackEmpty(s)){Pop(s,e);while((e.di==4) && !StackEmpty(s)){MarkPrint(maze,e.seat); //留下不能通过的标记,并退回一步Pop(s,e);curstep--;}if(e.di<4){e.di++;Push(s,e); //探索下一方向curpos=NextPos(e.seat,e.di); //设定当前位置是该新方向上的相邻块}}}while(!StackEmpty(s) && !found);return found;}void Print(int maze[][N]){int i,j;printf("表示迷宫的数组\n");for(i=0;i<M;i++){printf("\t");for(j=0;j<N;j++){printf("%d ",maze[i][j]);}printf("\n");}printf("\n");}3.程序的实现标记入口位置(说明此位置已试探),把入口压入栈中栈非空栈非空取栈顶元素初始试探方向存在试探方向确定试探位置的坐标试探位置是否为迷宫出口打印路径上每个位置是否为通道标记该位置换个方向试探返回该位置及方向进栈前进到下一位置C++ 方向向东r++ 方向向南C-- 方向向西r-- 方向向北r--c++c-- 位置(c,r)r++4.主函数设计void main(){int maze[M][N]={ 输出迷宫数组1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,1,0,0,1,1,1,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,0,1,1,0,1,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1};MazeType L;PosType start,end;Print(maze);InitMaze(L,maze,M,N);start.r=2; 定义迷宫入口和出口 start.c=4;end.r=6;end.c=9;printf("由数组转化出的迷宫");PrintMaze(L);if(MazePath(L,start,end))printf("迷宫的路径,用*表示");elseprintf("此迷宫没有通路!");PrintMaze(L);}5.测试第一次测试start.r=2; start.c=4; end.r=6;end.c=9;第二个测试start.r=1; start.c=1; end.r=6;end.c=96.心得体会数据结构是在整个计算机科学与技术领域上广泛被使用的术语。
可编辑修改西安建筑科技大学 课程设计(论文)题 目: 院 (系): 专业班级: 姓 名: 学 号: 指导教师:可视化走迷宫游戏2011 年 9 月 15 日欢迎下载可编辑修改西安建筑科技大学课程设计(论文)任务书专业班级: 计算机901 学生姓名: 指导教师(签名):一、课程设计(论文)题目走迷宫游戏:程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的 右下方有一个粮仓。
游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到 粮仓处。
二、本次课程设计(论文)应达到的目的数据结构是实践性很强的课程。
课程设计是加强学生实践能力的一个强有力手 段。
课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。
严格实 施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训 练,将起到显著的促进作用。
本题目要达到目的:熟练掌握最短路径的算法设计。
三、本次课程设计(论文)任务的主要内容和要求(包括原始数据、技术 参数、设计要求等)1、 老鼠形象可辨认,可用键盘操纵老鼠上下左右移动; 2、 迷宫的墙足够结实,老鼠不能穿墙而过; 3、 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败; 4、 添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙; 找出走出迷宫的所有路径,以及最短路径。
四、应收集的资料及主要参考文献:由于本课程没有安排“课内上机”学时,因此,在课程设计之前必须自己已经上 机练习了“线性表”的基本操作。
参考文献:1. 本年级使用的教材:数据结构与算法分析(C++版)(第二版)影印版 2005.72. 数据结构与算法,科学出版社,2005.08;赵文静 祁飞等编著 3. 数据结构-C++语言描述,西安交通大学出版社,1999.01,赵文静编著 4. 《Visual C++编程实例》(任意一本此类书籍)五、审核批准意见教研室主任(签字)欢迎下载可编辑修改摘要本设计是为了实现一个可视化迷宫,以及利用最短路径算法 寻找迷宫的出路以及将最短路径打印在屏幕上,并且限制小老鼠 不能穿越墙,只能在路径上移动。
小鼠走迷宫实验报告
实验目的:通过观察小鼠在不同迷宫中的表现,了解小鼠对空
间认知和学习能力的影响。
实验方法:选取6只健康的雄性小鼠,分别放入两个迷宫中进
行测试。
迷宫A包括5个隔间,每个隔间的大小为15cm x 15cm,高度为30cm。
隔间的分布方式皆为直线,通过平面和竖直的穿孔
相连接。
迷宫B包括3个圆形隔间,大小分别为60cm x 60cm,高度为25cm。
圆形隔间的连接方式为三个小门。
两组实验间隔一天
进行,实验时间为10分钟。
实验结果:在迷宫A中,小鼠的平均表现为第一次仅能成功走
出隔间1次,经过5次尝试后平均成功走出的次数为3.2次,成功
走出的时间平均为6分30秒。
在迷宫B中,小鼠的平均表现为第
一次仅能成功走出隔间1次,经过5次尝试后平均成功走出的次
数为4次,成功走出的时间平均为5分10秒。
实验讨论:通过对实验结果的分析,可以发现小鼠对于圆形迷
宫的印象要比直线迷宫的记忆更加深刻且容易记忆。
圆形迷宫的
分布结构使得小鼠更容易形成清晰的思维导图,并可以更快速地
找到正确的出口。
而迷宫A的分布方式更具挑战性,需要小鼠经
过多次尝试才能找到正确的出口,表现出小鼠在迷宫A中的表现显著不如在迷宫B中的表现。
实验结论:小鼠走迷宫实验中,空间的形状和连接方式对小鼠的表现有着显著的影响。
圆形迷宫具有更好的记忆效果,直线迷宫能够提高小鼠的学习能力和应对挑战的能力。
随着迷宫结构的变化和未来实验的深入进行,将有可能使得对小鼠的空间认知和学习能力方面有更全面深入的探讨和了解。
HUNAN CITY UNIVERSITY 数据结构课程设计报告设计题目:老鼠走迷宫专业:计算机科学与技术学生姓名:邓宇班级学号: 0906401-23指导教师:杨格兰、胡奇光2011 年 6 月 18 日一、设计时间2011年6月20日——24日二、设计地点湖南城市学院第一实验楼计算机系机房509三、设计目的1.培养实际工作所需要的动手能力,进一步熟悉基本概念;2.熟练掌握对实际问题的抽象技能,了解程序基本的流程;3.培养查阅资料,独立思考问题的能力。
四、设计人邓宇五、指导老师杨格兰、胡奇光六、设计课题老鼠走迷宫开发环境:Visual Studio 2010 Ultimate UML Activity DiagramVisual C # 2008 Express EditionsAdobe Photoshop CS4七、基本思路及关键问题的解决方法技术要求:程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。
要求:1、老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;解决方案:老鼠图片形象可以用Photoshop来制作,通过键盘按键事件发送消息到对象(老鼠),实现老鼠的移动。
2、迷宫的墙足够结实,老鼠不能穿墙而过;解决方案:在老鼠每一步的移动中检测是否撞墙,若是则停止走动。
由于地图是图片,要检测就需要取出墙壁那点的颜色(显然不是白色),然后作比较来作碰撞检测。
3、若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;解决方案:加载定时器,设定60秒钟,若在规定的时间,及时间变成0时,弹出对话框提示用户游戏失败。
4、添加编辑迷宫功能,可修改当前迷宫。
解决方案:备用一张地图图片资源,可以用于更换地图。
八、算法及流程图Visio流程图:因为这是面向对象而非面向工程的程序设计,事件和判断都具有同时性和并发性。
UML建模图如下:九、调试过程中出现的问题及解决方法本次课程设计出现最严重的问题是通过键盘来如何控制对象(老鼠)的移动,刚开始做时试用了多种方法但是没有效果。
数据结构课程设计之迷宫游戏##大学数据结构课程设计报告题目: 走迷宫游戏院(系): 计算机工程学院学生姓名:班级: 学号:起迄日期: 2011-6-21 至 2011-6-30 指导教师:2010—2011年度第 2 学期一、需求分析1 问题描述走迷宫游戏程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。
2 基本功能1) 老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;2) 迷宫的墙足够结实,老鼠不能穿墙而过;3) 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;4) 添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;5) 找出走出迷宫的所有路径,以及最短路径。
利用序列化功能实现迷宫地图文件的存盘和读出等功能 3 输入输出输入为字符型:1, 2, 3 分别实现功能选择w(上),s(下),a(左),d(右)控制迷宫的走向y表示确定 n表示否定二、概要设计1. 设计思路:实现走迷宫game()对迷宫地图进行修改实现自动搜路change()Mathpath()对搜寻的路径进行输对修改的地图数组进行保存出edit()print()对修改的地图进行保存savemap()2.数据结构设计:采用的是栈来存储数据,进栈实际是在栈中插入三元组,出栈则只数组的个数进行操作抽象数据类型线性表的定义如下:ADT SqStack{数据对象:D={a| a ?SElemType,i=1,2,3……,n,n?0} ii数据关系:R1={<a,a>| a,a ?D,i=1,2,3,……,n} i-1ii-1i基本操作:SqStack *InitStack()操作结果:创建一个空栈void Push(SqStack *S,SElemType data)初始条件:栈S已存在操作结果:插入一个元素,并且使数据个数加一(top++)void Pop(SqStack *S)初始条件:栈S已存在。
目录一、课题需求描述 (2)1.1走迷宫游戏 (2)二、总体功能与数据结构设计 (2)2.1总体功能结构 (2)2.2 数据结构设计 (2)三、算法设计和程序设计 (3)3.1 原理 (3)3.2 流程图 (3)3.3 算法设计 (4)四、调试与测试 (9)五、设计总结 (11)5.1 收获 (11)5.2 存在问题 (11)一、课题需求描述1.1走迷宫游戏程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。
要求:1) 老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;2) 迷宫的墙足够结实,老鼠不能穿墙而过;3) 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;4) 添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;5) 找出走出迷宫的所有路径,以及最短路径。
利用序列化功能实现迷宫地图文件的存盘和读出等功能。
二、总体功能与数据结构设计2.1总体功能结构实现概要设计中定义的所有数据类型及操作的伪代码算法节点类型和针类型;迷宫矩阵类型:int maze[M+2][N+2];为方便操作使其为全局变量;迷宫中节点类型及队列类型:struct point{int row,col,predecessor} que[512] 。
2.2 数据结构设计①屏幕上显示操作菜单②构建一个二维数组maze[M+2][N+2]用于存储迷宫矩阵③自动或手动生成迷宫,即为二维数组maze[M+2][N+2]④构建一个队列用于存储迷宫路径⑤建立迷宫节点struct point,用于存储迷宫中每个节点的访问情况⑥实现搜索算法三、算法设计和程序设计3.1 原理①屏幕上显示操作菜单②构建一个二维数组maze[M+2][N+2]用于存储迷宫矩阵③自动或手动生成迷宫,即为二维数组maze[M+2][N+2]④构建一个队列用于存储迷宫路径⑤建立迷宫节点struct point,用于存储迷宫中每个节点的访问情况⑥实现搜索算法3.2 流程图3.3 算法设计①主函数main()②手动生成迷宫函数shoudong_maze()③自动生成迷宫函数zidong_maze()④将迷宫打印成图形print_maze()⑤打印迷宫路径(若存在路径) result_maze()⑥入队enqueue()⑦出队dequeue()⑧判断队列是否为空is_Empty()⑨访问节点visit()⑩搜索迷宫路径mgpath()数据结构算法设计:①手动生成迷宫void shoudong_maze(int m,int n) { int i,j;cout<<endl;cout<<"请按行输入迷宫,0表示通路,1表示障碍(每输入一个数字请按空格或回车):";cout<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>maze[i][j]; //为二维数组maze[M+2][N+2]赋值}②系统自动生成迷宫void zidong_maze(int m,int n){int i,j;cout<<"迷宫生成中......"<<endl;system("pause");for(i=0;i<m;i++)for(j=0;j<n;j++)maze[i][j]=rand()%2; //为二维数组maze[M+2][N+2]赋值//由于rand()产生的随机数是从0到RAND_MAX//RAND_MAX是定义在stdlib.h中的,其值至少为32767)//要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X;}③搜索迷宫路径int mgpath(int maze[41][41],int m,int n){X=1;struct point p={0,0,-1};if(maze[p.row][p.col]==1){cout<<"========================================"<<endl;cout<<"此迷宫无解"<<endl;X=0;return 0;}maze[p.row][p.col]=2;enqueue(p);while(!is_Empty()){p=dequeue();if((p.row==m-1)&&(p.col==n-1))break;if((p.col+1<n)&&(maze[p.row][p.col+1]==0))visit(p.row,p.col+1,maze);if((p.row+1<m)&&(maze[p.row+1][p.col]==0))visit(p.row+1,p.col,maze);if((p.col-1>=0)&&(maze[p.row][p.col-1]==0))visit(p.row,p.col-1,maze);if((p.row-1>=0)&&(maze[p.row-1][p.col]==0))visit(p.row-1,p.col,maze);}if(p.row==m-1&&p.col==n-1){cout<<"========================================"<<endl;cout<<"迷宫路径为:"<<endl;cout<<p.row<<p.col;maze[p.row][p.col]=3;while(p.predecessor!=-1){p=queue[p.predecessor];cout<<p.row<<p.col;maze[p.row][p.col]=3;}}else{ cout<<"========================================"<<endl;cout<<"此迷宫无解!"<<endl;X=0;} return 0;}④将迷宫打印成图形void print_maze(int m,int n){int i,j;cout<<"迷宫生成结果如下:"<<endl;cout<<"迷宫入口"<<endl;cout<<"↓";for(i=0;i<m;i++){cout<<endl;for(j=0;j<n;j++){if(maze[i][j]==0)cout<<"□";//通路if(maze[i][j]==1)cout<<"■";//此路不通}}cout<<"→迷宫出口"<<endl;}⑤通路路径示意图void result_maze(int m,int n){int i,j;cout<<"迷宫通路(用“鼠”表示)如下所示:"<<endl;for(i=0;i<m;i++){cout<<endl;for(j=0;j<n;j++){if(maze[i][j]==0||maze[i][j]==2)cout<<"□";if(maze[i][j]==1)cout<<"■";if(maze[i][j]==3)cout<<"鼠";}}}void enqueue(struct point p)//入队{queue[tail]=p;tail++;}struct point dequeue()//出队{head++;return queue[head-1];}bool is_Empty() //判断队列是否为空{return head==tail;}⑥主函数int main(){int i,m,n,cycle=0;system("cls");system("color 0D");while(cycle!=(-1)){ //此处省略主界面设计代码cout<<endl<<endl;cout<<"Please input your selection>>>>>>>>>>"<<endl;cin>>i;switch(i){case 1:cout<<"请输入行数>>>>>>>>>>"<<endl;cin>>m;cout<<endl;cout<<"请输入列数>>>>>>>>>>"<<endl;cin>>n;while((m<=0||m>39)||(n<=0||n>39)){cout<<"您输入的行列数超出范围,请输入0-39的数!"<<endl;cout<<"请输入行数>>>>>>>>>>"<<endl;cin>>m;cout<<endl;cout<<"请输入列数>>>>>>>>>>"<<endl;cin>>n;}shoudong_maze(m,n);print_maze(m,n);mgpath(maze,m,n);if(X!=0)result_maze(m,n);cout<<"Press Enter Contiue!"<<endl;getchar();while(getchar()!='\n');break;case 2:cout<<"请输入行数>>>>>>>>>>"<<endl;cin>>m;cout<<endl;cout<<"请输入列数>>>>>>>>>>"<<endl;cin>>n;while((m<=0||m>39)||(n<=0||n>39)){cout<<"您输入的行列数超出范围,请输入0-39的数!"<<endl;cout<<"请输入行数>>>>>>>>>>"<<endl;cin>>m;cout<<endl;cout<<"请输入列数>>>>>>>>>>"<<endl;cin>>n;}zidong_maze(m,n);print_maze(m,n);mgpath(maze,m,n);if(X!=0)result_maze(m,n);cout<<"Press Enter Contiue!"<<endl;getchar();while(getchar()!='\n');break;case 3:cycle=(-1);break;default:cout<<"\n";cout<<"您的输入有误!请重新输入!"<<endl;cout<<"Press Enter Contiue!"<<endl;getchar();while(getchar()!='\n');break;}}return 0;}四、调试与测试1.主界面如图所示:2.手动生成迷宫(图为输入过程):3.执行后如图所示:4.系统自动生成迷宫(图为输入过程)5.执行后如图所示:五、设计总结5.1 收获通过这几个星期的算法设计技能训练,使我对数据结构这门课程有了更进一步的了解,对计算机方面的基础知识等也有了进一步的了解,在算法设计的过程中,往往程序本身不是最主要的,而最重要的则是如何在编写完成能够运行程序之后想出更好解决办法来解决某个问题,算法设计技能训练让我的思维变得更加开阔,考虑问题也更加全面了。
数据结构课程设计之迷宫游戏##大学数据结构课程设计报告题目: 走迷宫游戏院(系): 计算机工程学院学生姓名:班级: 学号:起迄日期: 2011-6-21 至 2011-6-30 指导教师:2010—2011年度第 2 学期一、需求分析1 问题描述走迷宫游戏程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。
2 基本功能1) 老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;2) 迷宫的墙足够结实,老鼠不能穿墙而过;3) 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;4) 添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;5) 找出走出迷宫的所有路径,以及最短路径。
利用序列化功能实现迷宫地图文件的存盘和读出等功能 3 输入输出输入为字符型:1, 2, 3 分别实现功能选择w(上),s(下),a(左),d(右)控制迷宫的走向y表示确定 n表示否定二、概要设计1. 设计思路:实现走迷宫game()对迷宫地图进行修改实现自动搜路change()Mathpath()对搜寻的路径进行输对修改的地图数组进行保存出edit()print()对修改的地图进行保存savemap()2.数据结构设计:采用的是栈来存储数据,进栈实际是在栈中插入三元组,出栈则只数组的个数进行操作抽象数据类型线性表的定义如下:ADT SqStack{数据对象:D={a| a ?SElemType,i=1,2,3……,n,n?0} ii数据关系:R1={<a,a>| a,a ?D,i=1,2,3,……,n} i-1ii-1i基本操作:SqStack *InitStack()操作结果:创建一个空栈void Push(SqStack *S,SElemType data)初始条件:栈S已存在操作结果:插入一个元素,并且使数据个数加一(top++)void Pop(SqStack *S)初始条件:栈S已存在。
数据结构上机报告(迷宫)迷宫求解小组成员问题提出:利用栈结构实现迷宫求解问题。
迷宫求解问题如下:心理学家把一只老鼠从一个无顶盖的大盒子的入口赶进迷宫, 迷宫中设置很多隔壁, 对前进方向形成了多处障碍, 心理学家在迷宫的唯一出口放置了一块奶酪, 吸引老鼠在迷宫中寻找通路以到达出口, 测试算法的迷宫如下图所示:问题分析及算法设计:1.迷宫中有障碍物的地方设置为1, 没有障碍物的地方设置为0;2.设起点下标为(1,1), 终点下标为(10,8);3.从起点出发(起点入栈), 栈中存放走过的路径(坐标);4.每次取栈顶元素, 在其上下左右中选一个能走通的且没有走过的点入栈;5.若该点为终点;则结束, 输出路径;6.若上下左右都不通或已走过, 则出栈, 栈空, 则走不通。
一.程序设计:1.用户手册:2.运行程序;3.根据提示, 在“请输入迷宫矩阵, <10*10>: ”后输入迷宫矩阵;4.按enter键, 根据提示, 在“请输入起始点<0~9>: ”后输入起始点;5.按enter键, 根据提示, 在“请输入结束点<0~9>: ”后输入结束点;6.按enter键, 即可得出最短路径的长度和最短路径的坐标表示;关闭操作窗口, 结束运行。
附图例:二.调试报告:附录: 程序代码:#include<iostream>using namespace std;struct Point{int x;int y;int pre;};void Copy(Point &a, Point &b){a.x =b.x;a.y =b.y;a.pre =b.pre;}struct Queue{Point p[100];int head=0;int tail=0;};void Append(Queue &d, Point p){d.p[d.tail].x = p.x;d.p[d.tail].y = p.y;d.p[d.tail].pre = p.pre;d.tail++;}void Delete(Queue &d,Point &a){Copy(a, d.p[d.head]);d.head++;}struct Stack{Point q[100];int head=0;};void push(Stack &s, Point p){s.q[s.head].x = p.x;s.q[s.head].y = p.y;s.head++;}void pop(Stack &s){s.head--;cout << "(" << s.q[s.head].x << "," << s.q[s.head].y << ")" << endl; }class Maze{public:Point p0;Point pn;int m[10][10];int i=0;int l;public:void Initp0();void Initpn();void pdp0pn();void InitM();void kz(Queue &Q,Point a);};void main(){int u=0;Queue Q;Stack S;Maze M;M.InitM();M.Initp0();Point a = M.p0;M.Initpn();Append(Q, a);while (1){if (u == 1)break;M.l = Q.tail;while (Q.head < M.l){Delete(Q,a);if (a.x == M.pn.x&&a.y == M.pn.y){u = 1;break;}else{M.kz(Q, a);M.m[a.x][a.y] = 1;}}M.i++;}cout <<"最短路径的长度为: "<< M.i-1 << endl;cout << "最短路径为: " << endl;while (a.pre>=0){push(S, a);a = Q.p[a.pre];}push(S,M.p0);while (S.head>0){pop(S);}}void Maze::Initp0(){cout << "请输入起始点(0~9):" << endl;cin >> p0.x >> p0.y;}void Maze::Initpn(){cout << "请输入结束点(0~9):" << endl;cin >> pn.x >> pn.y;}void Maze::InitM(){cout << "请输入迷宫矩阵(10*10):" << endl;for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++)cin >> m[i][j];}}void Maze::pdp0pn(){if (m[p0.x][p0.y] == 1 || m[pn.x][pn.y] == 1)cout << "输入的点不符合条件。
课程设计说明书课程名称:数据结构与算法专业:软件工程班级:15-2 姓名:xx 学号:2xxxxxx2指导教师:xx完成日期:2017 年 1 月 3 日任务书题目:老鼠走迷宫设计内容及要求:1.课程设计任务内容程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。
2.课程设计要求1)老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;2)迷宫的墙足够结实,老鼠不能穿墙而过;3)正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;4)添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;5)找出走出迷宫的所有路径,以及最短路径;6)利用序列化功能实现迷宫地图文件的存盘和读出等功能。
开发环境:QT Creator、 QT5.6目录1.引言 (3)2.课题分析 (4)3.具体设计过程 (5)3.1设计思路 (5)3.2程序设计流程图 (5)3.3.函数实现说明 (6)4.程序运行结果 (8)5.软件使用说明 (12)6.结论 (13)参考文献 (13)1.引言课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。
通常,课程设计中的问题比平时的习题复杂的多,也更接近实际。
课程设计着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时的习题较偏重于如何编写功能单一的“小”算法,局限于一个或两个知识点,而课程设计题是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。
此外,还有很重要的一点是:计算机是比任何教师更严厉的检查者。
为达到上述目的,使学生更好地掌握程序设计的基本方法和C++语言的应用,本课程安排了课程设计环节,提供了各类题目供学生选择。
老鼠走迷宫实验报告引言迷宫,即由一系列的通路和墙壁所组成的困难、曲折的空间结构,对某些生物行为的研究具有重要意义。
老鼠是被广泛应用于迷宫实验的实验动物之一,通过观察老鼠在迷宫中行为的变化,我们可以了解老鼠在环境中的感知能力和学习记忆能力。
本实验旨在探讨老鼠在迷宫中寻找出口的行为特征和策略变化。
材料与方法实验动物本实验选取了10只健康、体型相近的雄性实验小鼠作为实验对象。
实验设备采用了一个简单的2D迷宫模型,由一张0.5m×0.5m的实验台构成。
迷宫设置了多条路径,包括直线路径、弯曲路径和复杂路径,其中包括了盲道和障碍物。
实验过程每只老鼠在进行实验之前,依次进行了3次训练,以熟悉迷宫的结构和布局。
训练时,将老鼠放置于起点位置,观察其行为特征和路径选择。
实验过程中,将每只老鼠放置于起点位置,观察其进入迷宫后的行为变化,包括探索路径、改变方向和选择转角等。
记录老鼠的行为和路径选择情况,并进行定量统计和分析。
结果与讨论行为观察实验结果显示,老鼠在迷宫中表现出明显的探索行为。
进入迷宫之后,老鼠会快速地探索周围环境,寻找可能的路径。
在初始阶段,老鼠对迷宫中的各个路径都进行了尝试,但随着实验的进行,老鼠逐渐形成了策略性的行为。
观察发现,老鼠更倾向于选择直线路径,因为直线路径通常是最短的路径,老鼠能够更快地到达终点。
然而,对于复杂的路径,老鼠通常会尝试多种选择来寻找最佳路线。
路径选择统计结果显示,老鼠在初始阶段选择路径的随机性较高,但随着实验次数的增加,老鼠逐渐选择了稳定的路径。
这表明老鼠具有一定的学习能力,能够通过经验来改进其路径选择策略。
此外,我们还观察到老鼠在面对盲道和障碍物时的特殊行为。
老鼠倾向于避免盲道和障碍物,往往会优先选择有明显开口和通透性的路径。
学习与记忆实验结果表明,随着实验次数的增加,老鼠在迷宫中的行为变得越来越熟悉,寻路速度明显增加。
这说明老鼠具有记忆能力,能够通过多次实验来学习和记忆路径信息。
信息工程学院课程设计报告课程名称《数据结构》课题名称走迷宫游戏专业班级学号姓名联系方式指导教师2015 年 12 月 27 日目录1、数据结构课程设计任务书................................................ 错误!未定义书签。
、题目............................................................... 错误!未定义书签。
、要求............................................................... 错误!未定义书签。
2、总体设计.............................................................. 错误!未定义书签。
、设计思路及总体组成框架............................................. 错误!未定义书签。
、操作流程图......................................................... 错误!未定义书签。
3、详细设计.............................................................. 错误!未定义书签。
、程序中所采用的数据结构及存储结构的说明............................. 错误!未定义书签。
、函数功能模块说明................................................... 错误!未定义书签。
、各函数的调用关系.................................................... 错误!未定义书签。
4、调试与测试:.......................................................... 错误!未定义书签。
实验报告实验课名称:数据结构实验实验名称:迷宫问题班级:20130613 学号:16 姓名:施洋时间:2015-5-18一、问题描述这是心理学中的一个经典问题。
心理学家把一只老鼠从一个无顶盖的大盒子的入口处放入,让老鼠自行找到出口出来。
迷宫中设置很多障碍阻止老鼠前行,迷宫唯一的出口处放有一块奶酪,吸引老鼠找到出口。
简而言之,迷宫问题是解决从布置了许多障碍的通道中寻找出路的问题。
本题设置的迷宫如图1所示。
入口出口图1 迷宫示意图迷宫四周设为墙;无填充处,为可通处。
设每个点有四个可通方向,分别为东、南、西、北。
左上角为入口。
右下角为出口。
迷宫有一个入口,一个出口。
设计程序求解迷宫的一条通路。
二、数据结构设计以一个m×n的数组mg表示迷宫,每个元素表示一个方块状态,数组元素0和1分别表示迷宫中的通路和障碍。
迷宫四周为墙,对应的迷宫数组的边界元素均为1。
根据题目中的数据,设置一个数组mg如下int mg[M+2][N+2]={{1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1},{1,1,0,0,0,1,1,1},{1,0,0,1,0,0,0,1},{1,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1}};在算法中用到的栈采用顺序存储结构,将栈定义为Struct{ int i; //当前方块的行号int j; //当前方块的列号int di; //di是下一个相邻的可走的方位号}st[MaxSize];// 定义栈int top=-1 //初始化栈三、算法设计要寻找一条通过迷宫的路径,就必须进行试探性搜索,只要有路可走就前进一步,无路可进,换一个方向进行尝试;当所有方向均不可走时,则沿原路退回一步(称为回溯),重新选择未走过可走的路,如此继续,直至到达出口或返回入口(没有通路)。
在探索前进路径时,需要将搜索的踪迹记录下来,以便走不通时,可沿原路返回到前一个点换一个方向再进行新的探索。
竭诚为您提供优质文档/双击可除小鼠迷宫实验报告篇一:迷宫实验《迷宫》实验报告篇二:小鼠走迷宫获取食物的学习行为小鼠走迷宫获取食物的学习行为(1)提出问题:小鼠走迷宫获取食物是学习行为吗?(2)做出假设:小鼠走迷宫获取食物是学习行为(3)实验的目的:理解学习行为对与动物生存的重要意义(4)实验材料:小鼠、纸板(用于制作“迷宫”)、制作“迷宫”的各种工具,小鼠食物,笼子几个。
(5)方法步骤;①从迷宫的入口放入小鼠,同时在出口放置食品。
②记录小鼠“尝试与错误”的次数。
③重复上述实验过程5~7次,记录实验数据。
(6)注意事项.①通道的宽度要便于小鼠反折。
②实验前使小鼠处于饥饿状态。
(7)试验计划:认真统计小鼠需要经过几次“尝试与错误”才能通过“迷宫”,吃到食物。
(8)实验结论:小鼠走迷宫获取食物是学习行为学校:花都区三和庄中学姓名:卢婉仪利静琪班级:八年级三班指导老师:黄炽成篇三:生物实验报告探究小鼠走迷宫获取食物的学习行为实验报告提出问题:小鼠是否能经过训练,在很短的时间内形成一种新的行为?作出假设:仓鼠能够在短时间内形成一种新的行为。
制定计划:1.准备硬纸板、剪刀、透明(:小鼠迷宫实验报告)胶、铅笔等工具用来制作迷宫。
2.准备坚果、花生等食物放在迷宫的尽头。
3.准备一只仓鼠从固定地点放好食物,让仓鼠在迷宫中自由活动,必要时可引一下。
若仓鼠去到食物存放地点,让其进食一段时间后放回饲养笼中。
4、数次训练,直至仓鼠可以进入迷宫就直奔食物存放点为止。
实验过程:结论:仓鼠在经过训练后能在短时间内形成一种新的行为。
数据结构实验报告实验名称:实验二- 迷宫学生姓名:班级:班内序号:学号:日期:年月日1.实验要求利用栈结构实现迷宫求解问题。
迷宫求解问题如下:心理学家把一只老鼠从一个无顶盖的大盒子的入口赶进迷宫,迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口,测试算法的迷宫如下图所示。
提示:1、可以使用递归或非递归两种方法实现2、老鼠能够记住已经走过的路,不会反复走重复的路径3、可以自己任意设置迷宫的大小和障碍4、使用“穷举求解”的方法2. 程序分析设置一个迷宫,通过构建一个栈,通过push或pop栈元素探索一条走出迷宫的路径,并打印出结果。
2.1 存储结构栈2.2 关键算法分析1.设置一个迷宫,其大小用障碍物用数组表示。
数组中有障碍物的地方设置为1,没有障碍物的地方设置为0.2.构建一个栈,栈的结点有两个元素data和next。
有其top指针初始化为空。
3.构建一个结构数组Coord,开始时通过push函数加入老鼠最开始的位置栈元素并将top指针上移,指向加入栈的那个元素。
并将该数组中该位置标记为3.将该数组的x,y传入data。
4.并探索出口的下一步:判断老鼠的左右上下是否可走。
并重复这个过程。
直到找到出口,并打印结果。
Push如图:5.3. 程序运行结果及程序框图4.总结在做这个程序的时候,曾遇到很多困扰的地方,各种修改。
我觉得这次实验是一次有趣的体验。
既让我感受到了成功的喜悦,又让我学到了好多东西。
我很开心,也将继续这样努力着。
我期待着,成为一名较专业的“程序员”之后,我可以写出更好的东西,其实就算是一个看起来很简单的程序,也可以添加很多功能来,并且我认为,编程会不停地更新,我们可以不停地更新自己的程序,让程序更好、更简洁。
这就是我的目的,我会一直加油。
4.3下一步改进完善程序,实现输出所有路径。
课程设计说明书课程名称:数据结构与算法专业:软件工程班级:15-2 姓名:xx 学号:2xxxxxx2指导教师:xx完成日期:2017 年 1 月 3 日任务书题目:老鼠走迷宫设计内容及要求:1.课程设计任务内容程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。
2.课程设计要求1)老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;2)迷宫的墙足够结实,老鼠不能穿墙而过;3)正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;4)添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;5)找出走出迷宫的所有路径,以及最短路径;6)利用序列化功能实现迷宫地图文件的存盘和读出等功能。
开发环境:QT Creator、 QT5.6目录1.引言 (3)2.课题分析 (4)3.具体设计过程 (5)3.1设计思路 (5)3.2程序设计流程图 (5)3.3.函数实现说明 (6)4.程序运行结果 (8)5.软件使用说明 (12)6.结论 (13)参考文献 (13)1.引言课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。
通常,课程设计中的问题比平时的习题复杂的多,也更接近实际。
课程设计着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时的习题较偏重于如何编写功能单一的“小”算法,局限于一个或两个知识点,而课程设计题是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。
此外,还有很重要的一点是:计算机是比任何教师更严厉的检查者。
为达到上述目的,使学生更好地掌握程序设计的基本方法和C++语言的应用,本课程安排了课程设计环节,提供了各类题目供学生选择。
每个设计题采取了统一的格式,由问题描述、基本要求、测试数据、实现提示和选做内容等五个部分组成。
问题描述旨在为学生建立问题提出的背景,指明问题“是什么”。
基本要求则对问题进一步求精,划出问题的边界,指出具体的参量或前提条件,并规定该题的最低限度要求。
测试数据部分旨在为检查学生上机作业提供方便。
在实现提示部分,对实现中的难点及其解法思路等问题作了简要提示,提示的实现方法未必是最好的,学生不应拘泥与此,而应努力设计和开发更好的方法和结构。
选做部分向那些尚有余力的读者提出了更高的要求,同时也能开拓其它读者的思路,在完成基本要求时就力求避免就事论事的不良思想方法,尽可能寻求具有普遍意义的解法,使得程序结构合理,容易修改、扩充和重用。
2.课题分析编写一个《老鼠走迷宫》的C++程序,包括以下功能:初始状态:迷宫处为空白,输入长宽设定迷宫大小,时间剩余为300s。
具体要求如下:1. 点击生成迷宫,窗口左上方生成一个指定大小的迷宫,老鼠位于迷宫中央,粮仓位于迷宫右下角,开始计时。
2. 可以通过键盘上的方向键控制老鼠移动。
3. 点击显示路径按钮时,显示一条绿色的通道通向粮仓。
4. 点击最短路径按钮时,显示一条绿色的通道(最短)通向粮仓。
5. 点击拆墙/补墙时,老鼠可在迷宫内自由移动,老鼠所走过的墙将变成路/路将变成墙。
6. 点击取消作弊,恢复原始状态。
即老鼠只能通过路。
7. 当剩余时间为0时,弹出对话框,游戏失败,游戏结束。
8. 当老鼠走到粮仓处时,弹出对话框,找到出口,游戏结束。
9. 点击储存地图时,将当前地图以矩阵形势存于文件中;点击读取地图时,将文件中的数据赋予迷宫矩阵,创建迷宫。
3.具体设计过程3.1设计思路定义迷宫节点,包含x,y(坐标)与state(0为墙,1为通路),使用迷宫节点矩阵表示迷宫,使用回溯法创建迷宫节点矩阵。
利用深度优先遍历寻找出老鼠到粮仓的所有路径,利用广度优先遍历寻找老鼠到粮仓的最短路径,将路径中的节点的state置为2,在普通模式下,老鼠仅可通过state为1的节点,当作弊模式开启时,老鼠可通过任意state的节点并且通过的节点的state值会相应的改变。
打印迷宫时,state为0的节点使用黑色矩形填充,state为1的节点不填充,state为2的使用绿色矩形填充。
3.2程序设计流程图_maze //迷宫节点box //路径节点box1 //最短路径节点int i;int j;int state; int i;int j;int direction;int i;int j;int pre;int num;class mazepublic:void paintEvent(QPaintEvent *);void keyPressEvent(QKeyEvent *);bool isOdd(); //判断lineedit输入是否为奇数void creatMaze(); //创建迷宫void findWay(); //寻求路径(深度遍历)void findShortWay(); //寻求最短路径(广度遍历)private:QTime _time;_maze **matrix; //定义一个迷宫节点数组stack<_maze> *MazeStack; //定义一个栈用于存放迷宫节点vector<_maze> *FinalPath; //定义一个向量用于存放迷宫路径 stack<box> *BoxStack; //定义一个栈用于存放寻路节点queue<box1> *Box1Queue; //定义一个队列用于存放寻最短路节点 stack<box1> *Box1Stack; //定义一个栈用于存放寻最短路节点 int M; //迷宫矩阵的行int N; //迷宫矩阵的列bool first;bool remove_wall; //判断是否进行拆墙bool repair_wall; //判断是否补墙//老鼠的坐标int X;int Y;private slots:void on_way_clicked();void on_shortway_clicked();void on_removewall_clicked();void on_cancelremove_clicked();void on_makemaze_clicked();void timerUpdate();void on_repairwall_clicked();void on_savemaze_clicked();void on_readmaze_clicked();3.3.函数实现说明(1) void keyPressEvent(QKeyEvent *e) 功能:实现使用键盘完成对老鼠的控制。
(2) void paintEvent(QPaintEvent *) 功能:打印迷宫、路径、老鼠和粮仓。
(3) void creatMaze();功能:生成迷宫使用算法:回溯法、栈(4) void findWay();功能:寻找从老鼠到粮仓的路径。
使用算法:深度优先遍历(5) void findShortWay();功能:寻找从老鼠到粮仓的最短路径。
使用算法:广度优先遍历、队列(6) void timerUpdate();功能:更新剩余时间,当剩余时间为0时游戏结束。
4.程序运行结果1.初始状态2.点击生成迷宫,生成一个默认大小为25*25的迷宫3.点击寻找路径4.点击最短路径5.点击作弊拆墙(补墙)6.存储迷宫7.读取迷宫7. 时间耗尽时5.软件使用说明1.输入的长宽只能是奇数2.点击生成迷宫即可开始新的游戏3.该程序有一个局限性:只能存储一个迷宫,相应的,读取迷宫也只能读取上次存储的而不能选择。
6.结论课程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C++语言又是最常见,功能最强大的一种高级语言,因此做好C++语言课程设计是十分必要的。
回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整半个月的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针,链表……通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。
参考文献C++程序设计(第三版)C++ Primer Plus(第6版)QT从入门到精通数据结构与算法附录(源代码)maze.h#ifndef MAZE_H#define MAZE_H#include <QLCDNumber>#include <QTimer>#include <QTime>#include <QWidget>#include <iostream>#include <stack>#include <vector>#include <queue>#include <QTime>#include <QLineEdit>#include <QPushButton>#include <QPainter>#include <QLabel>#include <QMessageBox>#include <QDebug>#include <QKeyEvent>#include <QPixmap>using namespace std;struct _maze //定义迷宫节点,x、y代表坐标,state代表是否为墙{int i;int j;int state; //0代表为墙,1代表通路};struct box //定义寻求路径节点{int i;int j;int direction; //方向,0上 1右 2下 3左};struct box1 //定义寻求最短路径节点{int i;int j;int pre;int num;};namespace Ui {class maze;}class maze : public QWidget{Q_OBJECTpublic:explicit maze(QWidget *parent = 0);~maze();void paintEvent(QPaintEvent *);void keyPressEvent(QKeyEvent *);bool isOdd(); //判断lineedit输入是否为奇数void creatMaze(); //创建迷宫void findWay(); //寻求路径(深度遍历)void findShortWay(); //寻求最短路径(广度遍历)private slots:void on_way_clicked();void on_shortway_clicked();void on_removewall_clicked();void on_cancelremove_clicked();void on_makemaze_clicked();void timerUpdate();void on_repairwall_clicked();private:Ui::maze *ui;QTime _time;_maze **matrix; //定义一个迷宫节点数组stack<_maze> *MazeStack; //定义一个栈用于存放迷宫节点vector<_maze> *FinalPath; //定义一个向量用于存放迷宫路径stack<box> *BoxStack; //定义一个栈用于存放寻路节点queue<box1> *Box1Queue; //定义一个队列用于存放寻最短路节点stack<box1> *Box1Stack; //定义一个栈用于存放寻最短路节点int M; //迷宫矩阵的行int N; //迷宫矩阵的列bool first;bool remove_wall; //判断是否进行拆墙bool repair_wall; //判断是否补墙//老鼠的坐标int X;int Y;};#endif // MAZE_Hmaze.cpp#include "maze.h"#include "ui_maze.h"maze::maze(QWidget *parent) :QWidget(parent),ui(new Ui::maze){ui->setupUi(this);QTimer *time0 = new QTimer(this);connect(time0,SIGNAL(timeout()),this,SLOT(timerUpdate()));time0->start(1000);first=true;M=11;N=11;matrix=new _maze*[M];for(int i=0;i<M;i++){matrix[i]=new _maze[N];}for(int i=0;i<M;i++)for(int j=0;j<N;j++){matrix[i][j].state=0;//初始化迷宫矩阵,将所有节点设置为墙 matrix[i][j].i=i;matrix[i][j].j=j;}//随机生成种子数QTime time=QTime::currentTime();qsrand(time.msec()+time.second()*1000);MazeStack = new stack<_maze>;FinalPath = new vector<_maze>;BoxStack = new stack<box>;Box1Stack = new stack<box1>;Box1Queue = new queue<box1>;X = 1;Y = 1;remove_wall=false;repair_wall=false;}maze::~maze(){delete ui;}void maze::keyPressEvent(QKeyEvent *e){if(remove_wall)//如果拆墙{if(e->key()==87||e->key()==16777235)//上{if(X>1){matrix[X][Y].state=1;X=X-1;}}else if(e->key()==83||e->key()==16777237)//下 {if(X<M-2){matrix[X][Y].state=1;X=X+1;}}else if(e->key()==65||e->key()==16777234)//左 {if(Y>1){matrix[X][Y].state=1;Y=Y-1;}}else if(e->key()==68||e->key()==16777236)//右{if(Y<N-2){matrix[X][Y].state=1;Y=Y+1;}}//当老鼠到达粮仓时,重新构建迷宫地图,使得存放路劲的容器置为空if(X==M-2&&Y==N-2){QMessageBox::information(this,"Reminder","Find the exit!",QMessageBox::Yes); for(int i=0;i<M;i++)for(int j=0;j<N;j++)matrix[i][j].state=0;this->creatMaze();remove_wall=false;repair_wall=false;ui->cancelremove->setEnabled(false);ui->removewall->setEnabled(true);ui->repairwall->setEnabled(true);ui->way->setEnabled(true);ui->shortway->setEnabled(true);ui->makemaze->setEnabled(true);FinalPath->clear();X=M/2;Y=N/2;if(X%2==0)X+=1;if(Y%2==0)Y+=1;_time.restart();}}else if(repair_wall)//如果拆墙{if(e->key()==87||e->key()==16777235)//上{if(X>1){matrix[X][Y].state=0;X=X-1;}}else if(e->key()==83||e->key()==16777237)//下{if(X<M-2){matrix[X][Y].state=0;X=X+1;}}else if(e->key()==65||e->key()==16777234)//左{if(Y>1){matrix[X][Y].state=0;Y=Y-1;}}else if(e->key()==68||e->key()==16777236)//右{if(Y<N-2){matrix[X][Y].state=0;Y=Y+1;}}//当老鼠到达粮仓时,重新构建迷宫地图,使得存放路劲的容器置为空if(X==M-2&&Y==N-2){QMessageBox::information(this,"Reminder","Find the exit!",QMessageBox::Yes); for(int i=0;i<M;i++)for(int j=0;j<N;j++)matrix[i][j].state=0;this->creatMaze();remove_wall=false;repair_wall=false;ui->cancelremove->setEnabled(false);ui->repairwall->setEnabled(true);ui->removewall->setEnabled(true);ui->way->setEnabled(true);ui->shortway->setEnabled(true);ui->makemaze->setEnabled(true);FinalPath->clear();X=M/2;Y=N/2;if(X%2==0)X+=1;if(Y%2==0)Y+=1;_time.restart();}}else{int k;if(e->key()==87||e->key()==16777235)//上{k=X-1;if(k>0&&matrix[k][Y].state!=0)X=k;}else if(e->key()==83||e->key()==16777237)//下{k=X+1;if(k<M-1&&matrix[k][Y].state!=0)X=k;}else if(e->key()==65||e->key()==16777234)//左{k=Y-1;if(k>0&&matrix[X][k].state!=0)Y=k;}else if(e->key()==68||e->key()==16777236)//右{k=Y+1;if(k<N-1&&matrix[X][k].state!=0)Y=k;}if(X==M-2&&Y==N-2){QMessageBox::information(this,"Reminder","Find the exit!",QMessageBox::Yes); for(int i=0;i<M;i++)for(int j=0;j<N;j++)matrix[i][j].state=0;this->creatMaze();FinalPath->clear();X=M/2;Y=N/2;if(X%2==0)X+=1;if(Y%2==0)_time.restart();}}update();}void maze::paintEvent(QPaintEvent *) //画出迷宫{QPainter painter(this);painter.setPen(Qt::black);for(int i=FinalPath->size()-1;i>=0;i--){matrix[FinalPath->at(i).i][FinalPath->at(i).j].state=2;if(FinalPath->at(i).i==X&&FinalPath->at(i).j==Y) //当老鼠经过寻找迷宫路径时,使得state=1 {matrix[FinalPath->at(i).i][FinalPath->at(i).j].state=1;FinalPath->pop_back();}}if(!first){for(int i=0;i<M;i++)for(int j=0;j<N;j++){if(i==X&&j==Y)//画老鼠{painter.drawPixmap(j*20,i*20,20,20,QPixmap(":/img/img/mouse").scaled(20,20)); }else if(i==M-2&&j==N-2)//画粮仓{painter.drawPixmap(j*20,i*20,20,20,QPixmap(":/img/img/door").scaled(20,20)); }else{switch(matrix[i][j].state){case 0://画墙壁painter.setBrush(QBrush(Qt::black,Qt::SolidPattern));painter.drawRect(QRect(j*20,i*20,20,20));break;case 1://画通路//painter.setBrush(QBrush(Qt::white,Qt::SolidPattern));//painter.drawRect(QRect(j*20,i*20,20,20));case 2://画迷宫寻找路径painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));painter.drawRect(QRect(j*20,i*20,20,20));break;}}}}}bool maze::isOdd(){if(ui->xline->text().toInt()%2==0||ui->yline->text().toInt()%2==0)return false;return true;}void maze::timerUpdate() //更新时间,时间为0时游戏结束{int time1 = 300;if ((time1-((_time.elapsed())/1000)) < 0){QMessageBox::information(this,"Time Out!","Game over!",QMessageBox::Yes); for(int i=0;i<M;i++)for(int j=0;j<N;j++)matrix[i][j].state=0;this->creatMaze();FinalPath->clear();X=M/2;Y=N/2;if(X%2==0)X+=1;if(Y%2==0)Y+=1;_time.restart();}QString runTime = QString::number(time1-((_time.elapsed())/1000));ui->timer->setText(runTime);}//创建迷宫节点矩阵(回溯法)void maze::creatMaze(){//先设置初始点为(3,3)int i=3,j=3;int randNum=0;//设置迷宫节点矩阵初始点位置为通路matrix[i][j].state=1;//定义一个临时节点_maze temp;temp.i=i;temp.j=j;temp.state=1;//false表示访问的方向,bool Up=false;bool Down=false;bool Right=false;bool Left=false;//进入循环,不断生成迷宫矩阵,直至栈为空while(1){temp.i=i;temp.j=j;randNum=qrand()%4;switch(randNum){case 0://上if(!Up&&i>2&&matrix[i-2][j].state==0){MazeStack->push(temp);matrix[i-2][j].state=1;matrix[i-1][j].state=1;i=i-2;Up=false;Down=false;Right=false;Left=false;}elseUp=true;break;case 1://下if(!Down&&i<M-3&&matrix[i+2][j].state==0) {MazeStack->push(temp);matrix[i+2][j].state=1;matrix[i+1][j].state=1;i=i+2;Up=false;Down=false;elseDown=true;break;case 2://左if(!Left&&j>2&&matrix[i][j-2].state==0){MazeStack->push(temp);matrix[i][j-2].state=1;matrix[i][j-1].state=1;j=j-2;Up=false;Down=false;Right=false;Left=false;}elseLeft=true;break;case 3://右if(!Right&&j<N-3&&matrix[i][j+2].state==0){MazeStack->push(temp);matrix[i][j+2].state=1;matrix[i][j+1].state=1;j=j+2;Up=false;Down=false;Right=false;Left=false;}elseRight=true;break;}if(Up&&Down&&Right&&Left)//如果当前访问节点四个方向都没有可拆的节点,回溯 {if(!MazeStack->empty()){i=MazeStack->top().i;j=MazeStack->top().j;MazeStack->pop();Up=false;Down=false;else//如果栈为空的话就返回,此时迷宫矩阵已经创建完毕return;}}}//用深度优先遍历的方法寻找路径,将路径数据保存在FinalPath容器中void maze::findWay(){FinalPath->clear();int i,j,di,find;box box;box.i=X;box.j=Y;box.direction=-1;BoxStack->push(box);matrix[X][Y].state=-1;while(1){i=BoxStack->top().i;j=BoxStack->top().j;di=BoxStack->top().direction;if(i==M-2&&j==N-2)//如果当前栈顶为粮仓节点,将路径存放入FinalPath{while(!BoxStack->empty()){_maze temp;temp.i=BoxStack->top().i;temp.j=BoxStack->top().j;temp.state=1;FinalPath->push_back(temp);BoxStack->pop();}return;}find=0;while(find==0&&di<4){di++;switch(di){case 0:i=BoxStack->top().i-1;j=BoxStack->top().j;break;//向上寻路 case 1:i=BoxStack->top().i;j=BoxStack->top().j+1;break;//向右寻路case 3:i=BoxStack->top().i;j=BoxStack->top().j-1;break;//向左寻路 }if(matrix[i][j].state==1){find=1;}}if(find==1){matrix[i][j].state=-1;BoxStack->top().direction=di;box.i=i;box.j=j;box.direction=-1;BoxStack->push(box);}else{BoxStack->pop();}}}//用广度优先遍历的方法寻找迷宫路径,寻找的路径是最短路径void maze::findShortWay(){FinalPath->clear();while(!Box1Queue->empty())Box1Queue->pop();int i,j,find=0,di,k=0,count=0;box1 box1;_maze temp;box1.i=X;box1.j=Y;box1.pre=-1;box1.num=k;Box1Queue->push(box1);matrix[X][Y].state=-1;while(!Box1Queue->empty()&&!find){i=Box1Queue->front().i;j=Box1Queue->front().j;box1.i=i;box1.j=j;box1.num=Box1Queue->front().num;Box1Stack->push(box1);if(i==M-2&&j==N-2){find=1;while(!Box1Stack->empty()){temp.i=Box1Stack->top().i;temp.j=Box1Stack->top().j;temp.state=1;FinalPath->push_back(temp);count=Box1Stack->top().pre;//记录当前的路径节点的上一个坐标的下表 while(!Box1Stack->empty()&&count!=Box1Stack->top().num){Box1Stack->pop();}}}for(di=0;di<4;di++){switch(di)//0上1右2下3左{case 0:i=Box1Queue->front().i-1;j=Box1Queue->front().j;break;case 1:i=Box1Queue->front().i;j=Box1Queue->front().j+1;break;case 2:i=Box1Queue->front().i+1;j=Box1Queue->front().j;break;case 3:i=Box1Queue->front().i;j=Box1Queue->front().j-1;break;}if(matrix[i][j].state==1){k++;box1.i=i;box1.j=j;box1.num=k;box1.pre=Box1Queue->front().num;Box1Queue->push(box1);matrix[i][j].state=-1;}}Box1Queue->pop();}}void maze::on_way_clicked(){//使得迷宫矩阵的state为2的值变为1for(int i=0;i<M;i++){if(matrix[i][j].state==2){matrix[i][j].state=1;}}this->findWay();this->setFocus(Qt::MouseFocusReason); update();}void maze::on_shortway_clicked(){//使得迷宫矩阵的state为2的值变为1 for(int i=0;i<M;i++)for(int j=0;j<N;j++){if(matrix[i][j].state==2){matrix[i][j].state=1;}}this->findShortWay();this->setFocus(Qt::MouseFocusReason); update();}void maze::on_removewall_clicked(){FinalPath->clear();//使得迷宫矩阵的state为2的值变为1 for(int i=0;i<M;i++)for(int j=0;j<N;j++){if(matrix[i][j].state==2){matrix[i][j].state=1;}}update();remove_wall=true;ui->way->setEnabled(false);this->setFocus(Qt::MouseFocusReason); ui->cancelremove->setEnabled(true); ui->removewall->setEnabled(false);ui->shortway->setEnabled(false);ui->repairwall->setEnabled(true);QMessageBox::information(this,"Reminder","You can remove wall now!",QMessageBox::Yes); }void maze::on_repairwall_clicked(){FinalPath->clear();//使得迷宫矩阵的state为2的值变为1for(int i=0;i<M;i++)for(int j=0;j<N;j++){if(matrix[i][j].state==2){matrix[i][j].state=1;}}update();repair_wall=true;ui->way->setEnabled(false);this->setFocus(Qt::MouseFocusReason);ui->cancelremove->setEnabled(true);ui->removewall->setEnabled(true);ui->repairwall->setEnabled(false);ui->makemaze->setEnabled(false);ui->shortway->setEnabled(false);QMessageBox::information(this,"Reminder","You can repair wall now!",QMessageBox::Yes); }void maze::on_cancelremove_clicked(){remove_wall=false;repair_wall=false;this->setFocus(Qt::MouseFocusReason);ui->makemaze->setEnabled(true);ui->cancelremove->setEnabled(false);ui->shortway->setEnabled(true);ui->way->setEnabled(true);ui->repairwall->setEnabled(true);ui->removewall->setEnabled(true);}void maze::on_makemaze_clicked(){if(isOdd())if(ui->xline->text().toInt()>5&&ui->yline->text().toInt()>5) {_time.start();//删除原先matrix数组for(int i=0;i<M;i++)delete [] matrix[i];delete [] matrix;M=ui->xline->text().toInt();N=ui->yline->text().toInt();ui->label_2->setGeometry(170,(M+1)*20,110,30);ui->label_3->setGeometry(10,(M+1)*20,110,30);ui->xline->setGeometry(50,(M+1)*20,110,30);ui->yline->setGeometry(210,(M+1)*20,110,30);ui->makemaze->setGeometry((N+1)*20,370,100,30);ui->shortway->setGeometry((N+1)*20,170,100,30);ui->removewall->setGeometry((N+1)*20,220,100,30);ui->repairwall->setGeometry((N+1)*20,270,100,30);ui->cancelremove->setGeometry((N+1)*20,320,100,30);ui->way->setGeometry((N+1)*20,120,100,30);ui->label->setGeometry(340,(M+1)*20,130,40);ui->label_4->setGeometry((N+1)*20+2,20,75,30);ui->timer->setGeometry((N+1)*20,50,100,40);FinalPath->clear();ui->way->setEnabled(true);ui->removewall->setEnabled(true);ui->shortway->setEnabled(true);ui->repairwall->setEnabled(true);remove_wall = false;this->resize((N+7)*20,(M+3)*20);this->setFocus(Qt::MouseFocusReason);//初始老鼠的位置,在迷宫的中央X=M/2;Y=N/2;if(X%2==0)X+=1;if(Y%2==0)Y+=1;//重新创建新matrix数组,因为M和N发生了改变matrix=new _maze*[M];for(int i=0;i<M;i++){matrix[i]=new _maze[N];}for(int i=0;i<M;i++)for(int j=0;j<N;j++){matrix[i][j].state=0;//初始化迷宫矩阵,将所有节点设置为墙matrix[i][j].i=i;matrix[i][j].j=j;}this->creatMaze();first=false;update();}else{QMessageBox::information(this,"Warning","The input can not be less than5!",QMessageBox::Yes);ui->xline->clear();ui->yline->clear();}}else{QMessageBox::information(this,"Warning","The input can only be odd!",QMessageBox::Yes); ui->xline->clear();ui->yline->clear();}}main.cpp#include "maze.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);maze w;w.show();a.setWindowIcon(QIcon("s.ico"));return a.exec();}目录第一章总论...................................................... 错误!未定义书签。