数据结构课程设计之九宫格实验报告.doc
《数据结构课程设计之九宫格实验报告.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计之九宫格实验报告.doc(29页珍藏版)》请在沃文网上搜索。
1、数据结构课程设计报告九宫问题 一、简介1设计目的:通过实践掌握用广度优先搜索解决问题的方法2问题的描述: 在一个3*3的九宫中,有18这8个数,及一个空格随机的摆放在其中的格子里。如下面左图所示。要求实现这样的问题:将九宫问题调整为如右图所示的形式。调整的规则是:每次只能将与空格(上、下或左、右)相邻的一个数字平移到空格中。要求:问你通过移动中间的空格是否能达到右图所示的状态,如果能,则输出所走的路径,如果不能,则输出:unsolvable。最好能画出九宫的图形形式,并在其上动态的演示移动过程。 二、 数据结构的设计:1:为了了解九宫格的状态所以需要记录九宫格的当前状态2:因为要采用是两端同时
2、开始搜索的方法,所以要记录结点是从那个方向搜索到的3:为了减少重复搜索,所以要记录当前状态是由父结点怎么移动得来的4:需要输出路径,所以得记录从根节点到当前结点空格的移动路径5:需要一个队列来实现广度优先搜索6:还需要以一种便于访问的方式记录下所有已经访问过的结点,所以构造一个哈希表7:便于找到答案后释放所用空间,还需要将所有已搜索过的结点构造成一个链表综上定义如下结构体:typedef struct LNodeint data;/用一个各位不相等的9位数来表示当前状态,9表示空格int flag;/0表示由初始状态生成,1表示由末状态生成int fangxaing;/表示双亲结点生成此结点时
3、空格的移动方向char *path;/存放路径的数组下标,比实际值小1struct LNode *next,*next1;/next用于队列中,next1用于链表LNode,*Linklist;typedef struct Linklist front,rear;LinkQueue,*Queue;Linklist *hxb;/哈希表hxb=(Linklist*)calloc(362881,sizeof(Linklist);哈希函数为所有比表示这个状态的各位不相等的九位数小的各位不相等的九位数的个数,所以不会产生冲突三、 功能(函数)设计:本程序的人物要求是完成九宫格的求解并输出结果,根据任务要
4、求,总体上可以分为五个功能模块,分别为:1:程序功能介绍和操作提示模块:在主函数int main()中显示,用于程序功能的介绍和操作提示。2:检查输入九宫格是否有解的模块:int check(char a);,用于检测是否有解;3:寻找答案模块:int search(char a,char *path);,用于寻找路径并记录;4:输出路径模块:void print(char *path);将以字符串保存的路径转化为坐标输出;5:动态演示模块:void move(char *data,char *path);完成动态演示;功能模块图如下: int main()int check(char a)i
5、nt search(char a,char *path)void print(char *path)void move(char *data,char *path)End N Y 四、界面设计:初始界面: 然后根据界面的相关提示进行操作;根据相关操作,界面上显示相应操作结果。五、 程序设计:1:程序流程图如下: N Y N Y N Y 2:函数功能介绍:2.1:int main(void);用于程序功能的介绍和操作提示。2.2:int check(char a);检测数组a中存放的状态是否有解2.3:int check1(int n,char a);基础操作;返回a0到an-1中比n大的数的个
6、数;2.4:void nextpath(Linklist parent,Linklist child,int n);接收父节点以及表示移动方向的n生成子结点的路径;2.5:int next(Linklist parent,Linklist *child,int flag);接收父节点以及表示方向的flag,生成子节点信息;2.6:int f(int n);基础操作;哈希函数。返回n的哈希值;2.7:int inhxb(Linklist tem,Linklist a);将结点tem插入到哈希表中,并将tem插入到链表中。2.8:int bfs(Queue Q,Linklist parent,Li
7、nklist hxb);对结点parent进行宽度优先搜索;2.9:int search(char a,char *path);初始化队列,哈希表等为bfs做好前期工作,并在搜索后整合路径到path;2.10:void move(char *data,char *path);根据路径及初始状态进行动态演示;2.11:void print(char *path);将以字符串存储的路径转化为坐标输出;2.12:int InitLNode(Linklist *M,char *b,int n);基础操作,初始化结点;2.13:int InitQueue(Queue Q);基础操作,初始化队列;2.14
8、:int EnQueue(Queue Q,Linklist tem);基础操作,将结点tem插入队尾;2.15:int dequeue(Queue Q,Linklist *tem) ;基础操作,用结点指针tem来返回队头元素,并移动队头指针,因为结点继续使用,所以不释放空间;2.16:int DestroyQueue(Queue Q);基础操作;销毁队列,释放空间;2.17:int Destroylist(Linklist a);基础操作,销毁链表,释放空间;2.18:void swap(char *a,char *b);基础操作,通过指针操作来交换a,b的值;2.19:void gotoxy
9、(int x, int y);基础操作,将光标移动至坐标(x,y);2.20:void HideCursor();基础操作,隐藏光标;3. 函数调用关系如下:六、运行与测试:1、测试的数据及其结果:(1)输入;123456879;应输出unsolvable;(2)输入:123456987;应输出路径(1,3)(2,3)(3,3),并进行动态演示;(3)输入数据应保证可以表示一个九宫格的初始状态,程序不对输入是否合法进行检测;2、运行与测试期间遇到的问题及其解决办法。(1)问题1:输入状态是否有解的判定。解决方法:初步想法是先进行搜索,然后队列为空时判定无解。后经查阅资料得知可以通过数学方法用逆
10、置数来判定。(2) 问题 2:释放内存时出错。解决方法:设置断点,单步执行后发现,结点中只用一个next指针无法同时满足队列和链表操作的需求,后在结点中增设一指针解决;(3) 问题3:单步调试时发现有大量的状态重复进入队列。解决办法:在结构体中增设一个变量来记录父结点生成它时空格的移动方向,来避免它的子节点与其父节点相同,重复入队列影响效率。七、 课程设计总结:两周的课程设计已经结束了,有收获,也有不足和遗憾,完成了题目的基本要求,也将开始时构思的双向搜索顺利完成,顺利但绝不算成功的构造了一个可以使用的哈希函数,算是基本完成了课程设计,但限于种种原因,还是留下了些许遗憾,因为没有构思出合适哈希
11、函数的原因,哈希表整整使用了4倍于理论上最大值的空间,并且直到最后还没有找到一个合适的方法解决。而最后关于双向搜索的想法,用优先搜索队列结点较多的一端来代替目前的两端交替搜索,也因为时间的关系没有实现。八、 设计后的思考:通过本次课程设计,我主要有四点体会,首先是任何程序,无论它们有多复杂,都是由简单的C语句和精密的算法思想结合起来实现的。只要我们有坚实的基础理论和解决问题的信心以及耐心,便可以把他们分解为一个个的功能模块,在分解为实现功能模块的一些函数,甚至在分解为一些简单基本操作。把复杂的大问题转化为简单的易于上手的小问题;第二,关于代码低耦合性的思考,我们实现一个功能函数的时候不能只考虑
12、怎么实现它,还得考虑它的通用性,以及低耦合性,这次设计中使用的关于队列,链表,以及移动光标,隐藏光标的一些基本操作的函数,都是从之前的一些作品里直接拿出来的,只需要做少量甚至不需要修改便可以直接应用。这次课程设计过程中有几次需要在结构体里加一些元素来满足程序的功能,因为有意识的降低了代码的耦合性,所以当时只需在结构体里加入元素,就可以扩展相应的功能了,而这并不影响之前的模块的正常运行;第三,关于代码重用性的思考,代码重用性不光是以前做的代码现在可以使用,也包括在一个程序里面把实现功能的操作分解为一些简单基本操作,然后通过对这些基本操作的多次调用来实现相应的功能模块,从而优化了代码的结构,提高了
13、代码的重用性。并且,细分的操作越简单,出错的可能便越小,排错的难度也会相应的降低。第四,关于数学知识在程序里的应用,首次有这个感觉是在之前在北大OJ做的一道题,当时在查到我用几十行来模拟过程出来的结果原来可以用一个数学定理用一行便可以得出时,当时就瞬间感觉到了数学的重要性,包括这次的课程设计,不管是利用逆置数判定是否有解,还是后面的哈希函数的构建,都充分证明了,把数学运用到程序里是一件很有必要的事情。参考文献:1、杨秀金等. 数据结构(C语言版). 西安电子科技大学出版社20042、谭浩强. C语言程序设计. 清华大学出版社. 20023、李春保. 数据结构教程上机实验指导. 清华大学出版社.
14、 2005附源代码如下:#include#include#include#include #define U 56/up#define D 57/down#define L 58/left#define R 59/righttypedef struct LNodeint data;/用一个各位不相等的9位数来表示当前状态,9表示空格int flag;/0表示由初始状态生成,1表示由末状态生成int fangxaing;/表示双亲结点生成此结点时空格的移动方向char *path;/存放路径的数组下标,比实际值小1struct LNode *next,*next1;/next用于队列中,next
15、1用于链表LNode,*Linklist;typedef struct Linklist front,rear;LinkQueue,*Queue;void gotoxy(int x, int y)int xx=0x0b;HANDLE hOutput;COORD loc;loc.X=x;loc.Y=y;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput, loc);return;void HideCursor() CONSOLE_CURSOR_INFO cursor_info = 1, 0; Set
16、ConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);int InitQueue(Queue Q)Q-front=(Linklist)malloc(sizeof(LNode);Q-rear=Q-front;return 1;int EnQueue(Queue Q,Linklist tem)Q-rear-next=tem;Q-rear=tem;return 0;int dequeue(Queue Q,Linklist *tem)*tem=Q-front-next;Q-front=Q-front-next;return 0
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 九宫 实验 试验 报告 讲演 呈文