算法实验报告罗密欧与朱丽叶迷宫求解.docx
《算法实验报告罗密欧与朱丽叶迷宫求解.docx》由会员分享,可在线阅读,更多相关《算法实验报告罗密欧与朱丽叶迷宫求解.docx(13页珍藏版)》请在冰豆网上搜索。
算法实验报告罗密欧与朱丽叶迷宫求解
河南科技大学
课程设计报告
课程名称:
算法设计与分析
设计题目:
罗密欧与朱丽叶迷宫求解问题
院系:
电子信息工程学院
专业:
计算机科学与技术
班级:
计算机092班
课程设计题目
罗密欧与朱丽叶的迷宫问题
姓名
***
学号
x**
班级
092班
系别
电子信息工程学院
专业
计算机科学与技术
组别
1人
组长
***
组员
***
指导教师姓名
孙士保、张明川、冀治航
课程设计目的
进一步巩固C程序设计和算法设计与分析的基础知识,提升结构化程序、模块化程序设计的方法和能力,深入理解数据结构的基本理论,掌握数据存储结构的设计方法,掌握基于数据结构的各种操作的实现方法,训练对基础知识和基本方法的综合运用能力,增强对算法的理解能力,提高软件设计能力。
在实践中培养独立分析问题和解决问题的作风和能力。
设计环境
1.PC兼容机2.Windows2000/XP操作系统
3.TC集成开发环境或其他C语言开发环境
课程设计要求和任务
要求:
1.熟练掌握回溯法,能够利用回溯法解决实际问题;
2.使用文件进行存储和管理。
程序启动时可从文件中读取信息,或从键盘输入信息;运行过程中也可对文件进行存取;退出前可选择将部分信息保存到文件中;
3.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。
对程序其它部分也进行必要的注释。
4.对系统进行功能模块分析、画出总流程图和各模块流程图;
5.用户界面要求使用方便、简洁明了、美观大方、格式统一。
所有功能可以反复使用,最好使用菜单;
6.通过命令行相应选项能直接进入某个相应菜单选项的功能模块;
7.所有程序需调试通过。
任务:
完成罗密欧与朱丽叶的迷宫问题.设计内容包括:
1.确定能对给定的任何位置的罗密欧都能够找到一条通向朱丽叶的路线;
2.程序能够演示一条罗密欧找到朱丽叶的路线过程等。
课程设计工作进度计划
序号
起止日期
工作内容
1
下发任务书,分组,选定课题,查阅相关资料
2
总体设计,划分模块
3
编制源程序
4
上机调试,修改、完善系统
5
程序检查
6
撰写说明书
河南科技大学
课程设计任务书
课程名称:
算法设计与分析
题目:
罗密欧与朱丽叶迷宫求解问题
院系:
电子信息工程学院
班级:
计算机科学与技术092班
学生姓名:
***
指导教师:
孙士保、张明川、冀治航
起止日期:
2011年5月28日-2011年6月3日
2.3函数之间的关系.......................................................................................................3
第三章 编写代码及运行程序..............................................................................................3
3.1源程序..................................................................................................................................3
3.2操作及运行结果..................................................................................................................6
3.3设计的心得体会..................................................................................................................7
第一章需求分析
1.1课程设计题目
对于给定的罗密欧与朱丽叶的迷宫,编程计算罗密欧通向朱丽叶的所有最少弯道路
程序能够演示一条罗密欧找到朱丽叶的路线过程等
1.2课程设计任务及要求
罗密欧与朱丽叶的迷宫。
罗密欧与朱丽叶身处一个m×n的迷宫中,如图所示。
每一个方格表示迷宫中的一个房间。
这m×n个房间中有一些房间是封闭的,不允许任何人进入。
在迷宫中任 何位置均可沿8个方向进入未封闭的房间。
罗密欧位于迷宫的。
(p,q)方格中,他必须找出一条通向朱丽叶所在的(r,s)方格的路。
在抵达朱丽叶之前,他必须走遍所有未封闭的房间各一次,而且要使到达朱丽叶的转弯次数为最少。
每改变一次前进方向算作转弯一次。
请设计一个算法帮助罗密欧找出这样一条路。
1.3软硬件运行环境及开发工具
硬件:
装有windows操作系统的计算机
软件:
VisualC++6.0
第二章程序概要设计
2.1系统流程图
2.2函数的划分:
(1)函数1:
booltrackback(intx,inty)递归调用trackback函数求出最优路径。
(2)函数2:
voidisfull()判断房间是否全部走完
(3)函数3:
voidmain()主函数初始化迷宫数组,并调用trackback函数输出一条迷宫路线。
2.3.函数之间的关系:
如下图:
main函数
isfull函数
调用trackbask函数递归调用trackbask函数
输出结果
第三章编写代码及运行程序
3.1源程序
#include
intm,n,k;//m*n迷宫,k个封闭房间
intx,y;//迷宫中封闭房间的坐标
intp,q,r,s;//罗密欧与朱丽叶的坐标
int**square;//存储迷宫
int*dir;//用来记录每一步的方向
intlevel(0);//记录正在探测第几步
intfinalLevel(0);//初始化为零
int**result;//记录结果
int**path;
intturn(999);//记录最小拐弯数
intdirx[8]={0,0,1,1,1,-1,-1,-1};//8个方向变量
intdiry[8]={1,-1,-1,0,1,-1,0,1};
booltrackback(intp,intq);
boolIsFull();
voidmain()
{
inti,j;
cin>>m>>n>>k;
result=newint*[2];
result[0]=newint[n*m];
result[1]=newint[n*m];
path=newint*[2];
path[0]=newint[n*m];
path[1]=newint[n*m];
dir=newint[m*n];
square=newint*[m+2];//m+2是为了方便边界处理
for(i=0;i{
square[i]=newint[n+2];//n+2是也是为了方便边界处理
}
for(i=0;ifor(j=0;jsquare[i][j]=0;
for(i=0;i{//输入封闭房间的坐标,并使房间封闭
cin>>x>>y;
square[x][y]=-1;
}
//=================边界处理=====================
for(i=0,j=0;isquare[i][j]=1;
for(i=0,j=0;jsquare[i][j]=1;
for(i=m+1,j=0;jsquare[i][j]=1;
for(j=n+1,i=0;isquare[i][j]=1;
//==============================================
//输入罗密欧的坐标(p,q)和朱丽叶的坐标(r,s)
cin>>p>>q>>r>>s;
dir[0]=-1;//方向初始化
trackback(p,q);//回溯
cout<for(i=0;isquare[result[0][i]][result[1][i]]=i+1;
for(i=1;i{
for(intj=1;jcout<cout<}
}
booltrackback(intp,intq)
{//回溯过程
//===========将p、q放入path中===============
path[0][level]=p;
path[1][level]=q;
level++;//走出一步
square[p][q]=1;//标记起点已经走过
//==========================================
if(p==r&&q==s)
{//找到朱丽叶后求转弯数,最小者保存之
if(IsFull())
{//如果所有房间已经走过
intcount(0);
for(inti=1;iif(dir[i]!
=dir[i-1])count++;//若下一次的方向不同于上一次的方向,判定为一次转弯
if(count{//找出最小转弯数并保存之
finalLevel=level;//记录最后的步数
turn=count;
for(inti=0;i{//保存最优路径
result[0][i]=path[0][i];
result[1][i]=path[1][i];
}
}
}
square[p][q]=0;//若已经找到朱丽叶房间未走完,则重新置起点为0
level--;//后退
returnfalse;//该路径不是答案,剪掉该子树
}//退出找到朱丽叶的状态
for(inti=0;i<8;i++)
{//以下是未找到朱丽叶的状态向八个方向搜索
intx,y;
x=p+dirx[i];
y=q+diry[i];
if(square[x][y]==0)
{//若该房间没进入过,则标记其方向并进一步搜索
dir[level]=i;
trackback(x,y);
}
}
square[p][q]=0;//回到上一步
level--;//回到上一步
returntrue;//不需剪掉该子树
}
boolIsFull()
{//判断是否走满每个房间
for(inti=1;i<=m;i++)
for(intj=1;j<=n;j++)
if(square[i][j]==0)
returnfalse;
returntrue;
}
3.2操作及运作结果
输入输出并显示迷宫结果如下:
3.4设计的心得体会
通过本次课程设计的训练,增加了我学习算法的兴趣,虽然还不是很明白其中的具体内容,但已发现算法分析与程序设计的乐趣。
老师给了我们四个题目供选择,从选题到完成程序一步步操作实验不仅对题目有了深入的了解,还达到了熟练使用C语言编程的能力。
虽然还有很多复杂的问题是我们的能力所不及的,但我相信通过一次次实际的训练操作会使我们的解决问题的能力一步步有所提高。
这次程序设计是让我们学到了好多知识,但也暴露了我们在程序设计中的不足。
让我们更深一步体会到了上机实训的重要性。
学校给我们安排实训是为培养学生在实践中培养独立分析问题和解决问题的作风和能力,提高实际操作水。
让我们了解到除了学习基础知识之外上机实验也是必不可少的,只有通过多次的操作实验才能够提高自己的解决问题能力
计算机系课程设计指导教师评分表
课程设计题目
姓名
学号
专业班级
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
分值
评分要素
成绩
1设计过程中出勤、学习态度等方面
20
上机出勤及端正的学习态度、认真刻苦程度等
2软件设计质量
40
采用的算法、设计方案,设计结果,界面友好等方面进行综合评定
3答辩
20
能简明扼要地阐述设计的主要内容,能准确流利地回答各种问题
4设计报告书写
10
条理清晰,表述清楚、措词得当
5实际动手能力
10
组长全面负责,承担复杂的模块设计分值就高
总成绩
忽略此处..