数据结构课程设计迷宫问题.docx
- 文档编号:5088659
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:15
- 大小:48.08KB
数据结构课程设计迷宫问题.docx
《数据结构课程设计迷宫问题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计迷宫问题.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构课程设计迷宫问题
课程设计说明书
题目
迷宫系统
系(部)
计算机科学与技术系
专业(班级)
软件工程
姓名
学号
指导教师
起止日期
2011-09-4到2011-09-9
课程设计任务书
课程名称:
数据结构课程设计
一、课程设计的题目
迷宫问题
二、设计内容
1、迷宫问题
问题描述:
以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
迷宫问题要求求出从入口(1,1)到出口(m,n)的一条通路,或得出没有通路的结论。
基本要求:
首先实现一个以链表作存储结构的栈类型,然后编写一个求迷宫问题的非递归程序,求得的通路以三元组(i,j,d)的形式输出,其中:
(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
测试数据:
左上角(1,1)为入口,右下角(m,n)为出口。
选作内容:
(1)编写递归形式的算法,求得迷宫中的所有可能的通路
(2)以方阵的形式输出迷宫及其通路迷宫中的所有可能的通路
设计工作量:
40课时
工作计划:
见课表
指导教师签名:
日期:
教研室主任签名:
日期:
系主任签名:
日期:
长沙学院课程设计鉴定表
姓名
贺承誉
学号
2010022634
专业
软件工程
班级
软件六班
设计题目
迷宫问题
指导教师
魏歌
指导教师意见:
评定等级:
教师签名:
日期:
答辩小组意见:
评定等级:
答辩小组长签名:
日期:
教研室意见:
教研室主任签名:
日期:
系(部)意见:
系主任签名:
日期:
说明
课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;
摘要
计算机系的课程设计,我设计了一个迷宫系统,利用了栈结构来保存所走的迷宫路径,可以实现寻找迷宫通路的功能,当无法找到出口时,可提示用户不存在路径。
迷宫的地图可由手动输入,包括迷宫的行数与列数、迷宫的具体布局。
关键词:
课程设计;迷宫;数据结构。
目录
1.设计内容与要求1
2.设计说明2
2.1界面设计2
2.2数据结构3
3.实现与测试4
3.1结果4
3.2测试过程5
总结7
参考文献8
附录A源代码9
1.设计内容与要求
设计要求:
问题描述:
以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
迷宫问题要求求出从入口(1,1)到出口(m,n)的一条通路,或得出没有通路的结论。
基本要求:
首先实现一个以链表作存储结构的栈类型,然后编写一个求迷宫问题的非递归程序,求得的通路以三元组(i,j,d)的形式输出,其中:
(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
测试数据:
左上角(1,1)为入口,右下角(m,n)为出口。
选作内容:
(1)编写递归形式的算法,求得迷宫中的所有可能的通路
(2)以方阵的形式输出迷宫及其通路迷宫中的所有可能的通路
2.设计说明
2.1界面设计
迷宫系统欢迎界面如图2.1所示。
由三个菜单组成,为创建地图、打印路径与退出。
图2.1迷宫系统欢迎界面
迷宫界面如图2.2所示。
先按1创建地图,再输入迷宫行与列,再输入迷宫布局,出现图2.2的内容。
图2.2迷宫游戏界面
路径界面如图2.3所示。
创建好地图之后,按2就可以打印路径。
图2.3路径界面
2.2数据结构
数据结构图如图2.4所示。
主函数调用迷宫函数,迷宫函数调用输出路径函数,从而实现功能。
图2.4数据结构图
3.实现与测试
优良。
整个测试包含如下内容:
a.综合评估:
整个软件开发难度还算较简单,过程虽然繁琐,容易出错,但总的结果还算可以。
整体上较好,样式简单,美观。
b.软件开发中计划的执行情况:
测试页面的连接情况及是否出现异常状况。
测试结果状况良好,无出现不良情况。
c.软件质量目标完成情况:
完成情况良好,质量品质
3.1结果
输入一些临界数据进行测试:
当输入的迷宫为4*4的
1111
1111
1111
1111
时,输出结果为“不存在路径”。
如下图3.1:
图3.1
当输入的迷宫为4*4的
0000
0000
0000
0000
时,输出结果如下图3.2
图3.2
3.2测试过程
页面测试报告如表3.1:
表3.1页面测试报告
编号:
001
名称:
页面测试
前置测试用例
无
完成人:
贺承誉
测试对象:
检查是否正常显示,检查信息是否正确、完整
优先级:
高
测试人:
软件六班贺承誉
修改人:
软件六班贺承誉
测试步骤:
1.打开程序
2.输入选择功能
预期结果:
1.显示正常
2.信息显示正确、完整
测试结果:
成功
错误列表
序列
输入参数
错误结果
1.
无
无
迷宫结果测试报告如表3.2:
表3.2迷宫输出报告
测试对象:
检查输出结果是否符合要求,显示是否正确、完整
优先级:
高
测试人:
软件E班尹京伟
修改人:
软件E班尹京伟
测试步骤:
1.输入迷宫
2.输出路径
预期结果:
1.页面刷新后显示出路径坐标
2.显示的商品信息正确、完整
测试结果:
成功
错误列表
序列
输入参数
错误结果
1.
无
无
总结
综合评估:
整个软件开发难度还算较简单,过程虽然繁琐,容易出错,但总的结果还算可以。
整体上较好,样式简单,美观。
软件开发中计划的执行情况
测试页面的连接情况及是否出现异常状况。
测试结果状况良好,无出现不良情况。
软件质量目标完成情况:
完成情况良好,质量品质优良。
总结开发活动中的检验与教训
在本次课程设计中,我学会了许多的东西,开始的时候,我犯了许多的错误,通过同学和老师的帮助,一个个突破,才有这次的课程设计。
所以。
做啥事都得认真对待,这样才能提升自己。
参考文献
[1]王挺.数据结构[M].北京:
清华大学出版社,2005.
[2]吴伟民.数据结构[M].北京:
清华大学出版社,2006.
附录A源代码
#include
usingnamespacestd;
structD
{
intx;//x代表当前位置的行坐标
inty;//y代表当前位置的列坐标
intdir;
};
structLink
{
Ddata;
Link*next;
};
//Stack
classStack
{
private:
Link*top;//指向栈顶节点的指针
public:
Stack();
~Stack();
voidPush(constD&e);//把元素data压入栈中
DPop();//使栈顶元素出栈
DGetTop();//取出栈顶元素
boolEmpty();//判断栈是否为空,是空的话返回true
};
Stack:
:
Stack()//构造函数,置空栈
{
top=NULL;
}
Stack:
:
~Stack(){}//析构函数
voidStack:
:
Push(constD&e)//把元素x压入栈中
{
Link*P=newLink;
P->data=e;
P->next=top;
top=P;
}
DStack:
:
Pop()//使栈顶元素出栈
{
Link*P=top;
top=top->next;
DTemp=P->data;
deleteP;
returnTemp;
}
DStack:
:
GetTop(){returntop->data;}//取出栈顶元素
boolStack:
:
Empty(){return(top==NULL);}
intmove[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};//定义当前位置移动的8个方向
boolFindPath(int**maze,constint&m,constint&n);//寻找路径
voidPrint(Stack&p,int**maze,constint&m,constint&n);//输出迷宫的路径
int**CreateMaze(int&m,int&n);//创建迷宫
//返回存取迷宫的二维指针
intmain()
{
intm=0,n=0;//定义迷宫的长和宽
int**maze;//定义二维指针存取迷宫
intchoice=1,create=0;
while(choice)
{
cout<<"*******************迷宫系统*************************"< cout<<"请选择"< cout<<"创建迷宫地图--------------------------------------①"< cout<<"打印路径--------------------------------------②"< cout<<"退出--------------------------------------○"< cout<<"****************************************************"< cin>>choice; switch(choice) { case1: maze=CreateMaze(m,n);//调用GetMaze(int&m,int&n)函数,得到迷宫 create=1; break; case2: if(0==create) { cout<<"未创建迷宫地图,请先创建地图! ! "< maze=CreateMaze(m,n); } if(FindPath(maze,m,n))//调用Mazepath(int**maze,intm,intn)函数获取路径 cout<<"迷宫路径探索成功! \n"; else cout<<"路径不存在! \n"; break; case0: break; default: cout<<"输入有误,请重新输入"< break; } } return0; } int**CreateMaze(int&m,int&n)//返回存取迷宫的二维指针 { int**maze;//定义二维指针存取迷宫 inti=0,j=0,a,b; cout<<"请输入迷宫的长和宽: "; cin>>a>>b;//输入迷宫的长和宽 if(a<=1||b<=1) { cout<<"设置有误,默认设为2X2大小的"< a=2; b=2; } cout<<"请输入迷宫内容: (0代表可通,1代表不可通)\n"; m=a; n=b;//m,n分别代表迷宫的行数和列数 maze=newint*[m+2]; for(i=0;i { maze[i]=newint[n+2]; } for(i=1;i<=m;++i) for(j=1;j<=n;++j) cin>>maze[i][j]; for(i=0;i maze[i][0]=maze[i][n+1]=1; for(i=0;i maze[0][i]=maze[m+1][i]=1; //设置边界 returnmaze;//返回存贮迷宫的二维指针maze }; boolFindPath(int**maze,constint&m,constint&n)//寻找迷宫maze中从(0,0)到(m,n)的路径 //到则返回true,否则返回false { StackSpath,Sproc;//定义栈Sproc、Spath,分别存探索迷宫的过程和存储路径 DTemp1,Temp2; intx,y,loop; Temp1.x=1; Temp1.y=1; Sproc.Push(Temp1);//将入口位置入栈 Spath.Push(Temp1); maze[1][1]=2;//标志入口位置已到达过 while(! Sproc.Empty())//栈Sproc非空,则反复探索 { Temp2=Sproc.GetTop();//获取栈顶元素 if(! (Sproc.GetTop().x==Spath.GetTop().x&&Sproc.GetTop().y==Spath.GetTop().y)) Spath.Push(Temp2);//如果有新位置入栈,则把上一个探索的位置存入栈Spath for(loop=0;loop<8;++loop)//探索当前位置的8个相邻位置 { x=Temp2.x+move[loop][0];//计算出新位置x位置值 y=Temp2.y+move[loop][1];//计算出新位置y位置值 if(maze[x][y]==0)//判断新位置是否可达 { Temp1.x=x; Temp1.y=y; maze[x][y]=2;//标志新位置已到达过 Sproc.Push(Temp1);//新位置入栈 } if((x==(m))&&(y==(n)))//成功到达出口 { Temp1.x=m; Temp1.y=n; Temp1.dir=0; Spath.Push(Temp1);//把最后一个位置入栈 Print(Spath,maze,m,n);//输出路径 returntrue;//表示成功找到路径 } }//for //如果没有新位置入栈,则返回到上一个位置 if(Sproc.GetTop().x==Spath.GetTop().x&&Sproc.GetTop().y==Spath.GetTop().y) { Sproc.Pop(); Spath.Pop(); } }//while returnfalse;//表示查找失败,即迷宫无路经 } voidPrint(Stack&p,int**maze,constint&m,constint&n)//输出路径 { Stacktemp=p; Ddata; while(! temp.Empty()) { data=temp.Pop(); maze[data.x][data.y]=8; } inti,j; for(i=1;i<=m;++i) for(j=1;j<=n;++j) { if(maze[i][j]==8) cout<<'*'; else cout< cout<<''; if(j==n) cout< } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 迷宫 问题