数据结构与算法课程设计报告.docx
- 文档编号:3696593
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:14
- 大小:97.79KB
数据结构与算法课程设计报告.docx
《数据结构与算法课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构与算法课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构与算法课程设计报告
合肥学院
计算机科学与技术系
课程设计报告
2011~2012学年第二学期
课程
数据结构与算法
课程设计名称
骑士游历
学生姓名
王晓龙
学号
1004011026
专业班级
10级计本一班
指导教师
李红陈艳平
2012年6月10日
题目:
名称:
骑士游历
内容:
给你一个8*8的棋盘,骑士的开始位置,结束位置,让你求得骑士从开始位置开始走到结束位置需要最小的步数是多少?
(注意,骑士走日字)
要求:
(1)输入:
输入包含多组数据,每一行都是一组开始位置和结束位置,位置由两个字符组成,一个是小写字母(a-h),一个是数字(1-8),起始位置结束位置由一个空格隔开.
(2)输出:
输出从起始位置到结束位置,骑士所要走过的最小的步数.
(3)所设计的数据结构应尽可能节省存储空间。
(4)程序的运行时间应尽可能少。
一、问题分析和任务定义
此程序需要完成如下要求:
给你一个8*8的棋盘,骑士的开始位置,结束位置,让你求得骑士从开始位置开始走到结束位置需要最小的步数是多少?
(注意,骑士走日字)
实现本程序需要解决以下几个问题:
1、如何表示8*8的棋盘,确定棋盘上各点的位置。
2、马在棋盘上的各种行走方法怎样来表示,行走过程如何实现。
3、如何表示位置由两个字符组成,一个是小写字母(a-h),一个是数字(1-8)。
4、如何找到一条满足条件的路径。
5、如何确定这条路径是最短的。
本问题的关键和难点是如何根据骑士的走法规则,找出一条最短路径。
h
g
f
e
d
c
b
a|0
1
2
3
4
5
6
7
图1:
8*8的棋盘
如图,建立如上的坐标系,于是每个点的位置就可以用一个有序数对来表示。
如:
(a,3),(b,6),(h,2)。
对于任意一点的马最多有8中走法可以选择。
根据马行走后行列坐标数值大小的增加和减少情况的变化,用有序数组对来表示其走法。
staticintbx[8]={2,1,-1,-2,-2,-1,1,2};
staticintby[8]={1,2,2,1,-1,-2,-2,-1};
其中,bx数组与by数组下标相同的变量表示一种走法。
骑士在棋盘中的位置可由结构体类型
typedefstruct
{
intn,m;//n记录行数,m记录列数
intch;
}node;
来表示。
对于骑士的起始与终点位置可由有序对(x0,y0),(x1,y1)来表示。
另外建立一个队列,
typedefstruct//定义顺序队列类型
{
nodedata[maxlen];
intfront;
intrear;
}Sequeue;
把骑士从起点到终点的每一步入队,前一步出对。
二、概要设计与数据结构选择
对于所提出的关键问题,即找出从起点到终点的最短步数,这里所用到的方法是遍历起点与终点的所有路径,记录下其步数,然后比较其中最小的步数,即为最短步数。
1、输入起点和终点的坐标,起点先入对;
2、按照上述的8走法分别走一步,如果到达终点,计步器加一,如果未到终点,计步器加一并入对;(所有走法均入队)
3、出对,以步骤2中的如对顺序分别把其作为新起点,重复步骤2;
4、判断是否对空,对空则以走过全部路径,对未空,重复步骤3;对空,转到步骤5;
5、比较每种路径的步数,选出最小的数值,即为最小步数。
以上操作相当于对于一棵8个结点的完全树进行遍历,查找满足条件的结点,并找出这些结点中结点高度最低的结点。
以上过程可由树来表示。
树如图2:
…………
…………………………
………………………………
图2:
骑士游历的树结构
如图3,先找到起点,即根节点,并进行入队操作。
由起点逐次访问起点的各个子树的根节点,比较是否等于终点的坐标,若相等,则保存路径长度;若不相等,则把不相等的子树的根节点进行入队操作。
访问完所有子树的根节点后,进行一次出队操作;即把根节点出队。
此后顺次访问队头节点的子树的根节点,即顺次访问根节点的子树的根节点的各个子树的根节点,比较是否等于终点的坐标,若相等,则保存路径长度;若不相等,则把不相等的子树的根节点进行入队操作。
直到队为空为止。
访问顺序如下:
…………
…
图3:
游历的访问顺序
数据结构如下:
typedefstruct//骑士位置结构体
{
intn,m;//n记录行数,m记录列数
intch;
}node;
typedefstruct//顺序队列类型结构体
{
nodedata[maxlen];
intfront;
intrear;
}Sequeue;
图4:
详细设计流程图
三、详细设计和编码
首先,对于在问题分析和任务定义中所提出的问题逐个进行解决。
定义棋盘和走法,并对其进行初始化。
intway[8][8]表示棋盘每一点的位置,例如,way[2][2]表示第三行,第三列的坐标,way[3][6]表示第四行,第七列的坐标。
因为在本实验中并没有要求骑士行走的路径,所以棋盘可不显示的定义。
对于走法,我们前面已经提到了,对于马在棋盘中的任意位置,最多有8种走法,用有序数对表示即:
(2,1),(2,-1)(1,2),(1.-2)(-2,1),(-2,-1),(-1,2),(-1,-2)。
故,我们可以做如下定义:
根据马行走后行列坐标数值大小的增加和减少情况的变化,用有序数组对来表示其走法。
staticintbx[8]={2,1,-1,-2,-2,-1,1,2};
staticintby[8]={1,2,2,1,-1,-2,-2,-1};
其中,bx数组与by数组下标相同的变量表示一种走法。
所以在骑士的行走过程中,只要让骑士的位置即坐标加上或减去上述8中走法的数组表示。
对于骑士的起点和终点的位置表示,根据要求位置由两个字符组成,一个是小写字母(a-h),一个是数字(1-8)。
所以有如下的表示方法:
intx0,y0,x1,y1;charxa,xb;x0=xa-‘a’;x1=xb-‘a’;
其中,x0、y0表示起点坐标,x1、y1表示终点坐标,输入的xa,xb为字符,减去‘a’,便可转换成数字。
这样便可以把输入的字符坐标转换成用数字表示的坐标。
在得到骑士的起点终点坐标之后,便可以把起点入队,入队函数如下所示:
voidadd(Sequeue*S,intx,inty,intz)//入队函数
{
if(S->rear
{
S->rear++;
S->data[S->rear].n=x;
S->data[S->rear].m=y;
S->data[S->rear].ch=z;
}
elseprintf("error\n");
}
这里的参数x,y,z分别表示行坐标,列坐标,和到达该坐标从起点所走的步数。
它们的值分别保存在队列的n,m,ch中。
在对起点进行入队之后,便可进行运动了,即骑士可以按规则(8种走法)走向下一位置。
此后,在一个while循环中进行如下的操作,while循环的条件为:
S->front
对于骑士的8种走法,可以通过for(i=0;i<8;i++)循环进行逐个试探。
这里可以定义两个证型变量x3、y3;用以存放骑士走一步后的位置,即坐标。
则有如下定义:
x3=bx[i]+x0;y3=by[i]+y0;
又由实际情况可知,x3、y3应该满足x3、y3同时大于等于0且小于8;在此时设置标记数组step[maxlen][maxlen]=0;标记数组用以标记该位置是否已经走过,走过则置1;所以x3、y3还应满足step[x3][y3]==0;即(x3,y3)这个位置还未走过。
若满足以上条件,则可以定义node*p;并为其申请内存空间。
有如下一段程序:
p=(node*)malloc(sizeof(node));
p->ch=S->data[S->front+1].ch+1;
p->n=x3;
p->m=y3;
step[x3][y3]=1;
把(x3,y3)的值放入指针p指向的空间的(n,m)中,用以保存此位置;因为ch存放的是从起点到该位置所走的步数,故p->ch=S->data[S->front+1].ch+1;即它表示的意思是从起点x3、y3所走的步数。
此时并把x3y3的标记置为1,说明此位置已经被访问过了。
这时便可以对x3、y3进行判断了。
若p->n==x1&&p->m==y1,即比较x3、y3与终点的坐标是否相同。
若相同则找到一种走法。
此时定义inta=0;intcount[maxlen];count[a]数组的作用就是记录下每一种走法的步数;令count[a]=p->ch即可。
若不满足条件的话则把x3、y3入队;
然后i++;重复上述操作,直到i不满足条件为止,即已经走完了8种走法;
此后,进行出栈操作;判断S->front与S->rear的大小关系,若S->front>S->rear,则进行while循环,若不满足,则跳出while循环。
最后,对计数数组count[a]中的值进行比较,找出最小值,即为,从终点到起点的最小步数。
程序如下:
intmin;
min=count[0];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)