收藏 分享(赏)

九宫格实现算法.doc

上传人:jw66tk88 文档编号:6546012 上传时间:2019-04-16 格式:DOC 页数:9 大小:65.50KB
下载 相关 举报
九宫格实现算法.doc_第1页
第1页 / 共9页
九宫格实现算法.doc_第2页
第2页 / 共9页
九宫格实现算法.doc_第3页
第3页 / 共9页
九宫格实现算法.doc_第4页
第4页 / 共9页
九宫格实现算法.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、实验目的:通过 visual c+进行算法编辑,准确掌握算法运行方式及流程。通过程序实现类似九宫格的拼图效果,也叫做八方块。用最快的时间实现最后的效果:1 2 34 5 67 8 0实验原理:先实现一个三行三列数组,再依次比较第一个数与上下左右数值的大小,进行移动,最后实现效果图。计算出一共移动的步数和每移一步的效果。实验内容:程序代码如下:/ 8block.cpp : 定义控制台应用程序的入口点。/#include “stdafx.h“#include #include #include #define GOAL 123804765/表示我们要找得目标状态struct Node short

2、state9;/存放结点的状态short pos;/空格所在的位置,在数组中用 0 代表空格 struct Node *up;/空格上移后的状态struct Node *down;/空格下移后的状态struct Node *left;/空格左移后的状态struct Node *right;/空格右移后的状态struct Node *parent;/它是从哪一状态变换而来的struct Node *next;/表示在队列中的下一个状态 ;struct Treeshort key;/表示当前结点的数值short * state;/表示当前状态的整个数组,当整颗树生成完毕后这一数组将被释放short

3、 index;/表示当前数值在数组中的位置bool visited;/对于叶子结点而言,表示这一结点是否被访问过struct Tree * next;/指向它的(下一个)兄弟结点,表示这一位置的下一个数struct Tree *down;/指向它的第一个孩子结点,表示下一位置的第一个数;struct Queue/定义一个队列用于广度优先遍历struct Node * front;struct Node * rear;void InitQueue(struct Queue *Q);/初始化一个空队列bool QueueEmpty(struct Queue *Q);/判断队列是否为空void En

4、Queue(struct Queue *Q,struct Node *N);/入队列struct Node * DeQueue(struct Queue *Q);/出队列,返回队结点void ClearQueue(struct Queue *Q);/清空队列struct Node * GetBestPath(struct Node *tree);/找到一个最短路径,并返回最后的状态结点,如果没有路径返回 NULLstruct Tree * CreateCheckTree();/生成一个用于检查状态的查询树void CreateSubCheckTree(struct Tree * T);/生成状

5、态检查子树void FreeCheckTree(struct Tree * checkTree);/释放状态检查树的空间int checkCount=0;/检查结点状态次数int deCount=0;/出队列次数int enCount=0;/入队列次数struct Tree * checkTree;void main()struct Node* tree=new struct Node;tree-parent=NULL;printf(“输入 0-8 的任意一个排列,其中 0 表示空格所在的位置:n“);for(int i=0;istatei);for(int i=0;istate i=0)tr

6、ee-pos =i;tree-next =NULL;int c1=clock();struct Node *result=GetBestPath(tree);int c2=clock();double t=(c2-c1)/1000.0;printf(“状态检查次数:%d,入队列次数:=%d,出队列次数:%dn“,checkCount,enCount,deCount);if(result!=NULL)int path200;int count=0;struct Node *N=result;while(N!=NULL)pathcount=N-pos; N=N-parent;count+;prin

7、tf(“有最短路径,共须%d 步。n 下面给出各步空格出现的位置(第一个数为初始位置):n“,count-1);for(int i=count-1;i=0;i-)printf(“%d “,pathi);elseprintf(“不存在路径!“);printf(“n 所用时间为:%f 秒“,t);getchar();getchar();void FreeCheckTree(struct Tree * checkTree)if(checkTree-down!=NULL)FreeCheckTree(checkTree-down);if(checkTree-next!=NULL)FreeCheckTre

8、e(checkTree-next);delete checkTree;struct Tree * CreateCheckTree()struct Tree *T = new struct Tree;T-index =0;T-key =-1;T-next =NULL;T-down =NULL;T-state =new short10;T-state0=-1;for(int i=1;istate i=i-1;CreateSubCheckTree(T);return T;void CreateSubCheckTree(struct Tree * T)if(T-index=8)/如果前八个数都排好了T

9、-down =new struct Tree;T-down-key =T-state9;T-down-visited =false; T-down -down =NULL;T-down -next =NULL;delete T-state;elsestruct Tree *old=T;for(int i=T-index+1;istate =new short10;for(int j=0;jstate j=T-state j;current-index =T-index +1;/将指针前移current-next =NULL;current-down =NULL;current-key=curr

10、ent-statei;/将关键字设置为当前 i 所指处int temp=current-statecurrent-index;/以下三句完成交换current-statecurrent-index=current-statei;current-statei=temp;if(i=T-index+1)/如果是第一个孩子T-down=current;old=current;elseold-next =current;old=current;CreateSubCheckTree(current);delete T-state;bool checkNode(struct Node *N)checkCou

11、nt+;struct Tree *current=checkTree;for(int i=0;idown;while(N-statei!=current-key)current=current-next;if(current-visited=false)current-visited =true;return true;elsereturn false;struct Node * GetBestPath(struct Node *tree)/找到一个最短路径,并返回最后的状态结点,如果没有路径返回 NULLcheckTree=CreateCheckTree();/ printf(“分配完成!n

12、“);getchar();int i;struct Queue *Q=new struct Queue;InitQueue(Q);EnQueue(Q,tree);while(!QueueEmpty(Q)struct Node *N=DeQueue(Q);int index=0;for(i=0;istatei;if(index=GOAL)FreeCheckTree(checkTree);ClearQueue(Q);return N;if(N-pos=3)/空格可以往上移struct Node *up=new struct Node;for(i=0;istate i=N-state i;up-st

13、ateN-pos=up-state N-pos-3;/完成上移up-state N-pos-3=0;/同上up-pos =N-pos-3;if(checkNode(up)/如果这一状态以前没有出现过,保留这一状态N-up =up;up-parent =N;EnQueue(Q,up);else/如果这一状态以前出现过,delete up;N-up =NULL;/空格可以往上移if(N-posstate i=N-state i;down-stateN-pos=down-state N-pos+3;/完成下移down-state N-pos+3=0;/同上down-pos =N-pos+3;if(c

14、heckNode(down)/如果这一状态以前没有出现过,保留这一状态N-down =down;down-parent =N;EnQueue(Q,down);else/如果这一状态以前出现过,delete down;N-down =NULL;/空格可以往下移if(N-pos!=0 for(i=0;istate i=N-state i;left-stateN-pos=left-state N-pos-1;/完成上移left-state N-pos-1=0;/同上left-pos =N-pos-1;if(checkNode(left)/如果这一状态以前没有出现过,保留这一状态N-left =lef

15、t;left-parent =N;EnQueue(Q,left);else/如果这一状态以前出现过,delete left;N-left =NULL;/空格可以往左移if(N-pos!=2 for(i=0;istate i=N-state i;right-stateN-pos=right-state N-pos+1;/完成上移right-state N-pos+1=0;/同上right-pos =N-pos+1;if(checkNode(right)/如果这一状态以前没有出现过,保留这一状态N-right =right;right-parent =N;EnQueue(Q,right);else

16、/如果这一状态以前出现过,delete right;N-right =NULL;/空格可以往右移FreeCheckTree(checkTree);return NULL;void InitQueue(struct Queue *Q)/初始化一个空队列struct Node * head=new struct Node;head-next =NULL; Q-front =head;Q-rear=head;bool QueueEmpty(struct Queue *Q)/判断队列是否为空if(Q-front =Q-rear )return true;elsereturn false;void En

17、Queue(struct Queue *Q,struct Node *N)/入队列enCount+;Q-rear-next=N;Q-rear=N; ;struct Node * DeQueue(struct Queue *Q)/出队列,返回队结点deCount+;if(Q-front =Q-rear )printf(“队列已空!n“);return NULL;elsestruct Node *N=Q-front-next;Q-front-next=N-next;if(Q-rear=N)Q-rear =Q-front;return N;void ClearQueue(struct Queue *Q)/清空队列while(!QueueEmpty(Q)delete(DeQueue(Q);实验结果:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报