- 73
- 0
- 约1.27万字
- 约 29页
- 2018-06-20 发布于浙江
- 举报
数据结构课程设计之九宫实验报告
九宫问题
一、简介
1.设计目的:通过实践掌握用广度优先搜索解决问题的方法
2.问题的描述: 在一个3*3的九宫中,有1—8这8个数,及一个空格随机的摆放在其中的格子里。如下面左图所示。要求实现这样的问题:将九宫问题调整为如右图所示的形式。调整的规则是:每次只能将与空格(上、下或左、右)相邻的一个数字平移到空格中。
要求:问你通过移动中间的空格是否能达到右图所示的状态,如果能,则输出所走的路径,如果不能,则输出:unsolvable。最好能画出九宫的图形形式,并在其上动态的演示移动过程。
数据结构的设计:
1:为了了解九宫格的状态所以需要记录九宫格的当前状态
2:因为要采用是两端同时开始搜索的方法,所以要记录结点是从那个方向搜索到的
3:为了减少重复搜索,所以要记录当前状态是由父结点怎么移动得来的
4:需要输出路径,所以得记录从根节点到当前结点空格的移动路径
5:需要一个队列来实现广度优先搜索
6:还需要以一种便于访问的方式记录下所有已经访问过的结点,所以构造一个哈希表
7:便于找到答案后释放所用空间,还需要将所有已搜索过的结点构造成一个链表
综上定义如下结构体:
typedef struct LNode{
int data;//用一个各位不相等的9位数来表示当前状态,9表示空格
int flag;//0表示由初始状态生成,1表示由末状态生成
int fangxaing;//表示双亲结点生成此结点时空格的移动方向
char *path;//存放路径的数组下标,比实际值小1
struct LNode *next,*next1;//next用于队列中,next1用于链表
}LNode,*Linklist;
typedef struct {
Linklist front,rear;
}LinkQueue,*Queue;
Linklist *hxb;//哈希表
hxb=(Linklist*)calloc(362881,sizeof(Linklist));
哈希函数为所有比表示这个状态的各位不相等的九位数小的各位不相等的九位数的个数,所以不会产生冲突
功能(函数)设计:
本程序的人物要求是完成九宫格的求解并输出结果,根据任务要求,总体上可以分为五个功能模块,分别为:
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);完成动态演示;
功能模块图如下:
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[]);基础操作;返回a[0]到a[n-1]中比n 大的数的个数;
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
原创力文档

文档评论(0)