收藏 分销(赏)

数据结构专业课程设计方案报告范例.doc

上传人:二*** 文档编号:4516444 上传时间:2024-09-26 格式:DOC 页数:19 大小:154.54KB 下载积分:5 金币
下载 相关 举报
数据结构专业课程设计方案报告范例.doc_第1页
第1页 / 共19页
本文档共19页,全文阅读请下载到手机保存,查看更方便
资源描述
课程设计汇报 课程名称: 数据结构 课题名称: 迷宫问题 姓 名: 吴明华 学 号: 16020239 院 系: 计算机学院通信和信息工程系 专业班级: 通信112 指导老师: 周坚和 完成日期: 12月15日 目 录 第1部分 课程设计汇报…………………………………………………………3 第1章 课程设计目标…………………………………………………3 第2章 课程设计内容和要求…………………………………………4 2.1 问题描述………………………………………………4 2.2 设计要求………………………………………………4 第3章 课程设计总体方案及分析……………………………………4 3.1 问题分析………………………………………………4 3.2 概要设计………………………………………………7 3.3 具体设计………………………………………………7 3.4 调试分析………………………………………………10 3.5 测试结果………………………………………………10 3.6 参考文件………………………………………………12 第2部分 课程设计总结…………………………………………………………13 附录(源代码)……………………………………………………………………14 第1部分 课程设计汇报 第1章 课程设计目标 仅仅认识到队列是一个特殊线性表是远远不够,此次实习目标在于使学生深入了解队列特征,方便在实际问题背景下灵活利用它,同时还将巩固这种数据结构结构方………………………………………………………………………………………………………………………………………………………………………………………..(省略) 第2章 课程设计内容和要求 2.1问题描述: 迷宫问题是取自心理学一个古典试验。在该试验中,把一只老鼠从一个无顶大盒子门放入,在盒子中设置了很多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻求道路以抵达出口。对同一只老鼠反复进行上述试验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过数次试验最终学会走通迷宫路线。设计一个计算机程序对任意设定矩形迷宫以下图A所表示,求出一条从入口到出口通路,或得出没有通路结论。                                                       图A 2.2设计要求: 要求设计程序输出以下: (1) 建立一个大小为m×n任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏幕上显示出来; (2)找出一条通路二元组(i,j)数据序列,(i,j)表示通路上某一点坐标。 (3)用一个标志(如数字8)在迷宫中标出该条通路; (4)在屏幕上输出迷宫和通路; (5)上述功效可用菜单选择。 第3章 课程设计总体方案及分析 3.1 问题分析: 1.迷宫建立: 迷宫中存在通路和障碍,为了方便迷宫创建,可用0表示通路,用1表示障碍,这么迷宫就能够用0、1矩阵来描述, 2.迷宫存放: 迷宫是一个矩形区域,能够使用二维数组表示迷宫,这么迷宫每一个位置全部能够用其行列号来唯一指定,不过二维数组不能动态定义其大小,我们能够考虑先定义一个较大二维数组maze[M+2][N+2],然后用它前m行n列来存放元素,即可得到一个m×n二维数组,这么(0,0)表示迷宫入口位置,(m-1,n-1)表示迷宫出口位置。 注:其中M,N分别表示迷宫最大行、列数,本程序M、N缺省值为39、39,当然,用户也可依据需要,调整其大小。 3.迷宫路径搜索: 首先从迷宫入口开始,假如该位置就是迷宫出口,则已经找到了一条路径,搜索工作结束。不然搜索其上、下、左、右位置是否是障碍,若不是障碍,就移动到该位置,然后再从该位置开始搜索通往出口路径;若是障碍就选择另一个相邻位置,并从它开始搜索路径。为预防搜索反复出现,则将已搜索过位置标识为2,同时保留搜索痕迹,在考虑进入下一个位置搜索之前,将目前位置保留在一个队列中,假如全部相邻非障碍位置均被搜索过,且未找到通往出口路径,则表明不存在从入口到出口路径。这实现是广度优先遍历算法,假如找到路径,则为最短路径。 以矩阵 0 0 1 0 1 为例,来示范一下 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 首先,将位置(0,0)(序号0)放入队列中,其前节点为空,从它开始搜索,其标识变为2,因为其只有一个非障碍位置,所以接下来移动到(0,1)(序号1),其前节点序号为0,标识变为2,然后从(0,1)移动到(1,1)(序号2),放入队列中,其前节点序号为1,(1,1)存在(1,2)(序号3)、(2,1)(序号4)两个可移动位置,其前节点序号均为2.对于每一个非障碍位置,它相邻非障碍节点均入队列,且它们前节点序号均为该位置序号,所以假如存在路径,则从出口处节点位置,逆序就能够找到其从出口到入口通路。 以下表所表示: 0 1 2 3 4 5 6 7 8 9 10 (0,0) (0,1) (1,1) (1,2) (2,1) (2,2) (1,3) (2,3) (0,3) (3,3) (3,4) -1 0 1 2 2 3 4 5 6 7 9 由此能够看出,得到最短路径:(3,4)(3,3)(2,3)(2,2)(1,2)(1,1)(0,1)(0,0) 搜索算法步骤图以下所表示: 3.2 概要设计 1.①构建一个二维数组maze[M+2][N+2]用于存放迷宫矩阵 ②自动或手动生成迷宫,即为二维数组maze[M+2][N+2]赋值 ③构建一个队列用于存放迷宫路径 ④建立迷宫节点struct point,用于存放迷宫中每个节点访问情况 ⑤实现搜索算法 ⑥屏幕上显示操作菜单 2.本程序包含10个函数: (1)主函数 main() (2)手动生成迷宫函数 shoudong_maze() (3)自动生成迷宫函数 zidong_maze() (4)将迷宫打印成图形 print_maze() (5)打印迷宫路径 (若存在路径) result_maze() (6)入队 enqueue() (7)出队 dequeue() (8)判定队列是否为空 is_empty() (9)访问节点 visit() (10)搜索迷宫路径 mgpath() 3.3 具体设计 实现概要设计中定义全部数据类型及操作伪代码算法 1. 节点类型和指针类型 迷宫矩阵类型:int maze[M+2][N+2];为方便操作使其为全局变量 迷宫中节点类型及队列类型:struct point{int row,col,predecessor} que[512] 2. 迷宫操作 (1)手动生成迷宫 void shoudong_maze(int m,int n) {定义i,j为循环变量 for(i<=m) for(j<=n) 输入maze[i][j]值 } (2)自动生成迷宫 void zidong_maze(int m,int n) {定义i,j为循环变量 for(i<=m) for(j<=n) maze[i][j]=rand()%2 //因为rand()产生随机数是从0到RAND_MAX,RAND_MAX是定义在stdlib.h中,其值最少为32767),要产生从X到Y数,只需要这么写:k=rand()%(Y-X+1)+X; } (3)打印迷宫图形 void print_maze(int m,int n) {用i,j循环变量,将maze[i][j]输出 □、■} (4)打印迷宫路径 void result_maze(int m,int n) {用i,j循环变量,将maze[i][j]输出 □、■、☆} (5)搜索迷宫路径 ①迷宫中队列入队操作 void enqueue(struct point p) {将p放入队尾,tail++} ②迷宫中队列出队操作 struct point dequeue(struct point p) {head++,返回que[head-1]} ③判定队列是否为空 int is_empty() {返回head==tail值,当队列为空时,返回0} ④访问迷宫矩阵中节点 void visit(int row,int col,int maze[41][41]) {建立新队列节点visit_point,将其值分别赋为row,col,head-1,maze[row][col]=2,表示该节点以被访问过;调用enqueue(visit_point),将该节点入队} ⑤路径求解 void mgpath(int maze[41][41],int m,int n) {先定义入口节点为struct point p={0,0,-1},从maze[0][0]开始访问。假如入口处即为障碍,则此迷宫无解,返回0 ,程序结束。不然访问入口节点,将入口节点标识为访问过maze[p.row][p.col]=2,调用函数enqueue(p)将该节点入队。 判定队列是否为空,当队列不为空时,则运行以下操作: { 调用dequeue()函数,将队头元素返回给p, 假如p.row==m-1且p.col==n-1,即抵达出口节点,即找到了路径,结束 假如p.col+1<n且maze[p.row][p.col+1]==0,说明未到迷宫右边界,且其右方有通路,则visit(p.row,p.col+1,maze),将右边节点入队标识已访问 假如p.row+1<m且maze[p.row+1][p.col]==0,说明未到迷宫下边界,且其下方有通路,则visit(p.row+1,p.col,maze),将下方节点入队标识已访问 假如p.col-1>0且maze[p.row][p.col-1]==0,说明未到迷宫左边界,且其左方有通路,则visit(p.row,p.col-1,maze),将左方节点入队标识已访问 假如p.row-1>0且maze[p.row-1][p.col]==0,说明未到迷宫上边界,且其上方有通路,则visit(p.row,p.col+1,maze),将上方节点入队标识已访问 } 访问到出口(找到路径)即p.row==m-1且p.col==n-1,则逆序将路径标识为3即maze[p.row][p.col]==3; while(p.predecessor!=-1) {p=queue[p.predecessor]; maze[p.row][p.col]==3;} 最终将路径图形打印出来。 3.菜单选择 while(cycle!=(-1)) ☆ 手动生成迷宫 请按:1 ☆ 自动生成迷宫 请按:2 ☆ 退出 请按:3 scanf("%d",&i); switch(i) { case 1:请输入行列数(假如超出预设范围则提醒重新输入) shoudong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); case 2 :请输入行列数(假如超出预设范围则提醒重新输入) zidong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); case 3:cycle=(-1); break; } 注:具体源代码见附录 3.4 调试分析 在调试过程中,首先使用是栈进行存放,不过产生路径是多条或不是最短路径,所以经过算法比较,改用此算法 3.5 测试结果 1.手动输入迷宫   2.自动生成迷宫 3.6 参考文件 【1】 严蔚敏 吴伟民 《数据结构(C语言版)》 清华大学出版社, 9月 【2】 谭浩强 《C程序设计(第三版)》 清华大学出版社 1月 第2部分 课程设计总结 经过这段时间课程设计,本人对计算机应用,数据结构作用和C语言使用全部有了更深了解。尤其是C语言进步让我深刻感受到任何所学知识全部需要实践,没有实践就无法真正了解这些知识和掌握它们,使其成为自己财富。在理论学习和上机实践各个步骤中,经过自主学习和请教老师,我收获了不少。当然也碰到不少问题,也正是因为这些问题引发思索给我带了收获。从当初不喜爱上机写程序到现在能主动写程序,从当初拿着程序不只怎样下手到现在知道怎样分析问题,怎样用专业知识处理实际问题转变,我发觉不管是专业知识还是动手能力,自己全部有很大程度提升。在这段时间里,我对for、while等循环函数使用方法愈加熟悉,逐步形成了很好编程习惯。在老师指导帮助下,同学们课余时间讨论中,这些问题全部一一得到了处理。在程序调试能力上,无形中得到了很多提升。比如:头文件使用,变量和数组范围问题,定义变量时出现问题等等。 在实际上机操作过程中,不仅是让我们了解数据结构理论知识,更关键是培养处理实际问题能力,所以相信经过此次实习能够提升我们分析设计能力和编程能力,为后续课程学习及实践打下良好基础。 在这次短短课程实践里,我们得到了**老师关心和帮助。她给了我们很多信息,和我们一起探讨问题,问询我们碰到了哪些问题并耐心给指导。当我们碰到技术上难以处理问题时,她就会指导我们处理问题,她把自己多年来积累经验教授给我们,使我们顺利地完成了课程实践任务。时间过得真快,大学生活不知不觉就走过了十二个月,十二个月大学学习和课程实践阶段提升,使我们本身知识得到提升同时,也增强了我们对未来工作信心,我们相信自己未来三年学习更使我们有能力胜任未来工作。 附 录 #include"stdlib.h" #include"stdio.h" #define N 39 #define M 39 int X; int maze[N+2][M+2]; struct point{ int row,col,predecessor; }queue[512]; int head=0,tail=0; void shoudong_maze(int m,int n){ int i,j; printf("\n\n"); printf("请按行输入迷宫,0表示通路,1表示障碍:\n\n"); for(i=0;i<m;i++) for(j=0;j<n;j++) scanf("%d",&maze[i][j]); } void zidong_maze(int m,int n){ int i,j; printf("\n迷宫生成中……\n\n"); system("pause"); for(i=0;i<m;i++) for(j=0;j<n;j++) maze[i][j]=rand()%2; //因为rand()产生随机数是从0到RAND_MAX //RAND_MAX是定义在stdlib.h中,其值最少为32767) //要产生从X到Y数,只需要这么写:k=rand()%(Y-X+1)+X; } void print_maze(int m,int n){ int i,j; printf("\n迷宫生成结果以下:\n\n"); printf("迷宫入口\n"); printf("↓"); for(i=0;i<m;i++) {printf("\n"); for(j=0;j<n;j++) {if(maze[i][j]==0) printf("□"); if(maze[i][j]==1) printf("■");} } printf("→迷宫出口\n"); } void result_maze(int m,int n){ int i,j; printf("迷宫通路(用☆表示)以下所表示:\n\t"); for(i=0;i<m;i++) {printf("\n"); for(j=0;j<n;j++) {if(maze[i][j]==0||maze[i][j]==2) printf("□"); if(maze[i][j]==1) printf("■"); if(maze[i][j]==3) printf("☆"); } } } void enqueue(struct point p){ queue[tail]=p; tail++; } struct point dequeue(){ head++; return queue[head-1]; } int is_empty(){ return head==tail; } void visit(int row,int col,int maze[41][41]){ struct point visit_point={row,col,head-1}; maze[row][col]=2; enqueue(visit_point); } 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) {printf("\n===============================================\n"); printf("此迷宫无解\n\n");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) {printf("\n==================================================================\n"); printf("迷宫路径为:\n"); printf("(%d,%d)\n",p.row,p.col); maze[p.row][p.col]=3; while(p.predecessor!=-1) {p=queue[p.predecessor]; printf("(%d,%d)\n",p.row,p.col); maze[p.row][p.col]=3; } } else {printf("\n=============================================================\n"); printf("此迷宫无解!\n\n");X=0;} return 0; } void main() {int i,m,n,cycle=0; while(cycle!=(-1)) { printf("********************************************************************************\n"); printf(" 欢迎进入迷宫求解系统\n"); printf(" 设计者:李娜娜。高玮芳 \n"); printf("********************************************************************************\n"); printf(" ☆ 手动生成迷宫 请按:1\n"); printf(" ☆ 自动生成迷宫 请按:2\n"); printf(" ☆ 退出 请按:3\n\n"); printf("********************************************************************************\n"); printf("\n"); printf("请选择你操作:\n"); scanf("%d",&i); switch(i) {case 1:printf("\n请输入行数:");scanf("%d",&m); printf("\n"); printf("请输入列数:");scanf("%d",&n); while((m<=0||m>39)||(n<=0||n>39)) {printf("\n抱歉,你输入行列数超出预设范围(0-39,0-39),请重新输入:\n\n"); printf("请输入行数:");scanf("%d",&m); printf("\n"); printf("请输入列数:");scanf("%d",&n); } shoudong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); printf("\n\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break; case 2:printf("\n请输入行数:");scanf("%d",&m); printf("\n"); printf("请输入列数:");scanf("%d",&n); while((m<=0||m>39)||(n<=0||n>39)) {printf("\n抱歉,你输入行列数超出预设范围(0-39,0-39),请重新输入:\n\n"); printf("请输入行数:");scanf("%d",&m); printf("\n"); printf("请输入列数:");scanf("%d",&n); } zidong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); printf("\n\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break; case 3:cycle=(-1);break; default:printf("\n");printf("你输入有误!\n"); printf("\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break; } } }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服