版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构课程设计报告设计题目:马踏棋盘院系计算机学院年级11级学生xxxxxxx学号xxxxxxxxx指导教师xxxxxxxxx起止时间9-6/9-132013 年 9 月 10 日星期二1 / 9目录一、 课程设计目的-3二、 需求分析 -3三、程序源代码 - 4四、调试分析 -7五、问题总结 -8六、参考资料 -92 / 9一、 课程设计目的(1) 熟练使用 C 语言编写程序,解决实际问题 ;(2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3) 初步掌握软件开发过程的问题分析、 系统设计、程序编码、 测试等基本方法和技能 ;(4) 提高综合运用所学的理论知识和方
2、法独立分析和解决问题的能力;二、 需求分析问题描述 : 将马随机放在国际象棋的 8X8 棋盘中的某个方格中, 马按走棋规则进行移动。 要求每个方格上只进入一次, 走遍棋盘上全部 64 个方格。编制递归程序,求出马的行走路线 ,并按求出的行走路线,将数字 1 , 2, 64 依次填入 8X8 的方阵输出之。测试数据 : 由读者指定可自行指定一个马的初始位置。实现提示 : 每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”悔棋使用。并探讨每次选择位置的“最佳策略” ,以减少回溯的次数。背景介绍:国际象棋为许多令人着迷的娱乐提供了固定的框架
3、, 而这些框架常独立于游戏本身。其中的许多框架都基于骑士奇异的 L 型移动规则。一个经典的例子是骑士漫游问题。从十八世纪初开始,这个问题就引起了数学家和解密爱好者的注意。简单地说,这个问题要求从棋盘上任一个方格开始按规则移动骑士,使之成功的游历国际象棋棋盘的64 个方格,且每个方格都接触且仅接触一次。可以用一种简便的方法表示问题的一个解,即将数字 1, 64 按骑士到达的顺序依次放入棋盘的方格中。一种非常巧妙的解决骑士漫游地方法由J.C.Warnsdorff于 1823 年给出。他给出的规则是: 骑士总是移向那些具有最少出口数且尚未到达的方格之一。其中出口数是指通向尚未到达方格的出口数量。在进
4、一步的阅读之前, 你可以尝试利用 Warnsdorff 规则手工构造出该问题的一个解。实习任务:编写一个程序来获得马踏棋盘即骑士漫游问题的一个解。您的程序需要达到下面的要求:棋盘的规模是 8*8 ;对于任意给定的初始化位置进行试验,得到漫游问题的解;对每次实验,按照棋盘矩阵的方式,打印每个格被行径的顺序编号。技术提示:解决这类问题的关键是考虑数据在计算机中的存储表示。 可能最自然的表示方法就是把棋盘存储在一个 8*8 的二维数组 board 中。以 (x,y) 为起点时骑士可能进行的八种移动。一般来说,位于 (x,y) 的骑士可能移动到以下方格之一:(x-2,y+1) 、 (x-1,y+2)
5、、 (x+1,y+2) 、 (x+2,y+1) 、 (x+2,y-1) 、 (x+1,y-2) 、 (x-1,y-2) 、 (x-2,y-1) 。但请注意,如果 (x,y) 的位置离某一条边较近,有些可3 / 9能的移动就会把骑士移到棋盘之外, 而这当然是不允许的。 骑士的八种可能的移动可以用一个数组 MoveOffset 方便地表示出来:MoveOffset0=(-2,1)MoveOffset1=(-1,2)MoveOffset2=(1,2)MoveOffset3=(2,1)MoveOffset4=(2,-1)MoveOffset5=(1,-2)MoveOffset6=(-1,-2)Move
6、Offset7=(-2,-1)于 是 , 位 于 (x,y) 的 骑 士 可 以 移 动 到 (x+MoveOffsetk.x, y+MoveOffsetk.y) ,其中 k 是 0 到 7 之间的某个整数值, 并且新方格必须仍位于棋盘上。扩展需求:可以考虑将结果图形化。 (b) 考察所有初始化的情况,测试是否都能够得到解。三、程序源代码#include#include#define MAXSIZE 100#define N 8int board88;/定义棋盘int Htry18=1,-1,-2,2,2,1,-1,-2;/* 存储马各个出口位置相对当前位置行下标的增量数组*/int Htry
7、28=2,-2,1,1,-1,-2,2,-1;/*存储马各个出口位置相对当前位置列下标的增量数组*/struct Stack/定义栈类型int i;/行坐标int j;/列坐标int director;/存储方向stackMAXSIZE;/定义一个栈数组int top=-1;/栈指针void InitLocation(int xi,int yi); /马在棋盘上的起始位置坐标int TryPath(int i,int j);/在每个方向进行尝试,直到试完整个棋盘void Display();/输出行走的路径void InitLocation(int xi,int yi)int x,y;/定义棋
8、盘的横纵坐标变量top+;/栈指针指向第一个栈首4 / 9stacktop.i=xi;/将起始位置的横坐标进栈stacktop.j=yi;/将起始位置的纵坐标进栈stacktop.director=-1; /将起始位置的尝试方向赋初值boardxiyi=top+1;/标记棋盘x=stacktop.i;/将起始位置的横坐标赋给棋盘的横坐标y=stacktop.j;/将起始位置的纵坐标赋给棋盘的纵坐标if(TryPath(x,y)/调用马探寻函数, 如果马探寻整个棋盘返回1 否则返回 0Display();/输出马的行走路径elseprintf(无解 );int TryPath(int i,int
9、 j)int find,director,number,min; /临时变量int i1,j1,h,k,s;/临时变量int a8,b18,b28,d8; /临时数组while(top-1)/栈不空时循环for(h=0;h=0&i=0&j8)/如果找到下一位置for(k=0;k=0&i1=0&j18)/如果找到下一位置number+;/记录条数ah=number;/将条数存入数组a8 中for(h=0;h8;h+)/根据可行路径条数小到大按下表排序放入数组d8 中min=9;for(k=0;kak)min=ak;dh=k;/将下表存入数组d8 中s=k;as=9;director=stackt
10、op.director;if(top=63)/若走完整个棋盘返回1return (1);find=0;/没有找到下一个位置for(h=director+1;h=0&i=0&j8) /如果找到下一位置find=1;/表示找到下一个位置break;if(find=1)/如果找到下一个位置进栈stacktop.director=director; /存储栈结点的方向top+;/栈指针前移进栈stacktop.i=i;stacktop.j=j;stacktop.director=-1;/重新初始化下一栈结点的尝试方向boardij=top+1;/标记棋盘else/否则退栈boardstacktop.i
11、stacktop.j=0; /清除棋盘的标记top-;/栈指针前移退栈return (0);void Display()system(color 1e);int i,j;6 / 9for(i=0;iN;i+)for(j=0;jn);printf(n);printf(欢迎进入骑士漫游小游戏! n);printf(n);int i,j;int x,y;for(i=0;iN;i+) / 初始化棋盘 for(j=0;j.请输入初始位置坐标(x,y)注 :(1,1)-(8,8)n);printf(Input x = );scanf(%d,&x);/输入起始位置的横坐标printf(Input y = )
12、;scanf(%d,&y);/输入起始位置的纵坐标if(x=1&x=1&y=8)break;printf(n输入有误 , 请重新输入 !nn);printf(骑士从第 %d行,第 %d列开始漫游 :n,x,y);InitLocation(x-1,y-1);/调用起始坐标函数7 / 9四、调试分析1. 开始界面2.输入坐标五、问题总结此次数据结构课程设计我组设计的是一个利用栈递归得到的马踏遍棋盘的演示程序,刚看题目时候觉得还比较困难,根本没一点思绪,但通过在网上查找相关资料,对这个问题才有了一定的思绪。在组员的分工合作中,我们终于把程序写出来了。在这个过程中,我收获颇多,不仅理论知识掌握的8 / 9更牢,实际动手能力
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新形势下老年用品产品行业顺势崛起战略制定与实施分析报告
- 2025年玉环市选调公务员考试试卷真题
- 2025年铜川辅警真题
- 2026.07.10塑料颗粒夜间全自动装车机
- 孩子抚养协议书(15篇)
- 小学主题班会课件:强化安全教育提升自我保护意识
- 关于2026年潜在合作伙伴的初步洽谈函(6篇)
- 2026第十医院面试题目及答案
- 警惕交通隐患安全护航成长小学主题班会课件
- 2026反诈中心面试题目及答案
- 中医规培小讲课教案
- 智慧树知到《中国近现代史纲要(山东师范大学)》2025章节测试附答案
- VATS术中出血和处理
- 《房车亚克力外推窗技术规范》
- 110KV电压互感器局部放电试验
- 20以内加减法之凑十法、破十法、平十法图解练习题
- 深圳大学《算法设计与分析》2023-2024学年期末试卷
- 肝硬化肝性脑病诊疗指南(2024年版)解读
- 大学物理实验智慧树知到期末考试答案章节答案2024年山东交通学院
- 小区物业安全生产工作方案
- 2024年江苏江南水务股份有限公司招聘笔试参考题库附带答案详解
评论
0/150
提交评论