数据结构课程设计-马踏棋盘实验报告(仅供参考).doc
《数据结构课程设计-马踏棋盘实验报告(仅供参考).doc》由会员分享,可在线阅读,更多相关《数据结构课程设计-马踏棋盘实验报告(仅供参考).doc(17页珍藏版)》请在沃文网上搜索。
1、一、【问题描述】设计一个国际象棋的马踏棋盘的演示过程。基本要求:将马随机放在国际象棋的8*8棋盘Board88的某个方格中,马按走棋规则进行移动,要求每个方格只进行一次,走遍整个棋盘的全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,64依次填入一个8*8的方阵,输出之。测试数据:可自行制定一个马的初始位置(i,j),0=I,j=7。二、【实验目的】1、对数据结构基本理论和存储结构及算法设计有更深入的理解;2、了解栈的特性,以便在实际问题背景下灵活运用他们;3、提高在世纪设计操作中系统分析、结构确定、算法选择、数学建模和信息加工的能力。三、【设计过程】第1步:
2、实现提示一般来说,当马位于位置(i,j)时,可以走到下列8个位置之一:81726354(i-2,j+1),(i-1,j+2)(i+1,j+2),(i+2,j+1)(i+2,j-1),(i+1,j-2)(i-1,j-2),(i-2,j-1) (图-1) 但是,如果(i,j)靠近棋盘的边缘,上述有些位置可能要超出棋盘位置,成为不允许的位置。8个可能位置可以用一位数组HTry107和HTry207来表示: 0 1 2 3 4 5 6 7-2-11221-1-21221-1-2-2-1 (表-2)位于(i,j)的马可以走到新位置是在棋盘范围内的(i+HTry1h,j+HTry2h),其中h=07。第2
3、步:需求分析(1) 输入的形式和输入值的范围:输入马的初始行坐标X和列坐标Y,X和Y的范围都是1,8。(2) 输出形式:以数组下表的形式输入,i为行标,j为列标,用空格符号隔开。以棋盘形式输出,每一格打印马走的步数,这种方式比较直观(3) 程序所能达到的功能:让马从任意起点出发都能够遍历整个8*8的棋盘。(4) 测试数据,包括正确输入及输出结果和含有错误的输入及其输出结果。数据可以任定,只要1=x,y=8就可以了。正确的输出结果为一个二维数组,每个元素的值表示马行走的第几步,若输入有错,则程序会显示:“输入有误!请重新输入”并且要求用户重新输入数据,直至输入正确为止。第3步,算法设计思想:1、
4、输入马所在初始位置的坐标值,考虑到用户的输入习惯,此处1=x,y=8;2、将输入的初始值进栈;3、设置一个while循环,循环条件为count64;4、取出栈顶元素;5、定义flag标志变量的值;6、按照SetRound函数逆时针顺序优先原则,找栈顶元素周围未被占用 的7、新位置。若存在该位置,则令order的值等于该新位置的坐标,并入 栈;8、否则弹出栈顶元素;9、再次回到第步while循环进行判断;10、输出一个8*8的方阵,所示数字即为相应步骤。 第4步,算法框图: 开始输入初始坐标X,Y判断X,Y是否合法?Initstack建立新栈并且将初始位置入栈count64GetTop取栈顶元素
5、;找出所有可走位置根据for循环及优先原则查找是否存在下一个坐标?调用push函数将其压缩进栈调用Pop函数将栈顶元素弹出输出否是否是否是第5步,存储结构设计:(1)、位置的存储表示方式typedef struct int x; int y; int from;Point;(2)、栈的存储方式#define STACKSIZE 70#define STACKINCREASE 10typedef struct Stack Point *top; Point *base; int stacksize; 第6步,设计功能分析与实现(1)、设定栈的抽象数据类型定义: ADT Stack 数据对象:D=
6、ai | aiElemSet,i=1,2,n,n0 数据关系:R1=|ai-1, aiD,i=2,n 约定an端为栈顶,ai端为栈顶。 基本操作: InitStack(&s) 操作结果:构造一个空栈s, DestroyStack(&s) 初始条件:栈s已存在。 操作结果:栈s被销毁。 ClearStack(&s) 初始条件:栈s已存在。 操作结果:栈s清为空栈。 StackEmpty(&s) 初始条件:栈s已存在。 操作结果:若栈s为空栈,则返回TRUE,否则返回FALSE。 StackLength(s); 初始条件:栈s存在。 操作结果:返回s的元素个数,即栈的长度。 GetTop (s,&
7、e); 初始条件:栈s已存在且非空。 操作结果:用e返回s的栈顶元素。 Push(&s,e) 初始条件:栈s已存在。 操作结果:插入元素e为新的栈顶元素。 Pop(&s,&e) 初始条件:栈s存在且非空。 操作结果:删除栈顶元素,并用e返回。 stackTraverse(s,visit() 初始条件:栈s存在且非空。 操作结果:从栈底到栈顶依次对s的每个元素调用visit()。一旦visit()失败,则操作失败。ADT Stack(2)、选取对该程序有用的函数。 1、InitStack(&s) 用于构建空栈实现相应的操作; 2、StackEmpty(&s) 用于判断空栈情况,已确保循环体能够准
8、确实现; 3、GetTop (s,&e) 用于取放入栈的栈顶元素,实现把放入的横纵坐标按要求取出; 4、Push(&s,e) 用于将用户输入的横纵坐标放入栈; 5、Pop(&s,&e) 用于实现将要求取出的元素取出;(3)、主要函数及算法说明。 1、函数:void SetRound(Point cur) 参数:Point cur 功能:找出当前位置下一步的八个位置,将其赋给g_round8; 算法:接受参数传来的值,按逆时针次序加上 g_roundi.x=-2,-1,1,2,2,1,-1,-2; g_roundi.y=1,2,2,1,-1,-2,-2,-1; 再根据GetRound函数来判断是
9、否合法;若合法则返回TRUE,否则返回FALSE. 2、函数:Status GetRound(int i,Point &pt) 参数:int i,Point &pt 功能:将所在位置周围八个位置坐标赋予指针变量,并判断其合理性; 算法:用以下赋值语句pt.x=g_roundi-1.x; pt.y=g_roundi-1.y; 将现在周围8个指定位置赋予指针变量pt,并用 if(pt.x0|pt.y7|pt.y7) 条件语句判断其合理性,若合理则返回TRUE,否则返回FALSE. 3、语句:for(int i=cur.from+1;i=8;i+) if(GetRound(i,next)&erder
10、next.xnext.y=0) 语句 功能:按照逆时针优先规则,选出下一个可用的位置,通过if判断语句来判断所选的下一步是否可用,若可用,则使其进栈,否则运行下面一个语句。 4、语句:if(!flag) 语句. while(j1) 语句.功能:如果当前位置不存在任何新路径,则根据while循环进行退栈,直至退到存在有最佳位置的坐标。蛋必须保证栈不为空。所以此出栈中设定了int GetDeep的基本操作,就是防止空栈还继续弹东西出来的情况发生。 四、【调试程序】 (1)、问题:语法错误 原因:首次运行语法错误比较多,一般都是由于粗心大意输入有误造成的,还有一些错误属于变量忘记定义之类的,经过认真
11、一个一个调试后这类错误得以解决。下图为第一次运行时的错误 (2)、问题:运行后突然停止程序 原因:可能是输出不恰当 解决:此问题出现后,刚开始不知道为啥,看了很多遍程序就是找不出原由,于是后来请教同学,一起研究后无意中改了输出格式,将printf(%s,%2d ,|,orderij);改成了printf(%d,%f ,orderij,|);竟然成功输出了。怀疑是%s使用得不恰当。 下图为修改前的运行结果:(3)、问题:将上述问题解决后虽然不会出现程序突然终止的情况,但运行结果如下图,输出结果很乱; 原因:输出格式不符 解决:将printf(%d,%f ,orderij,|);改成printf(
12、| %2d ,orderij);(4)、问题:上述问题都搞定后,输入初始坐标后按下Enter键后立即退出了 原因:main()函数里有scanf(),当用户输入初始坐标后,将这两个坐标赋予给&begin.x,&begin.y,结果当用户想用Enter键进行确认操作后,Enter本身是一个字符,而这个字符不符合循环要求,所以直接退出 解决:多加一个getchar()把Enter键给吸收掉,结果如下图:五、【用户手册】 (1)、用户界面,如下图:(2)、按照提示,输入1 2进行数据测试,如下图:(3)、输入y则继续回到主界面,如果输入n则退出系统,如下图:(4)、若在主界面输入x和y不在确定范围,
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 棋盘 实验 报告 仅供参考