收藏 分享(赏)

启发式搜索算法解决八数码问题(C语言).doc

上传人:j35w19 文档编号:7622588 上传时间:2019-05-22 格式:DOC 页数:9 大小:108KB
下载 相关 举报
启发式搜索算法解决八数码问题(C语言).doc_第1页
第1页 / 共9页
启发式搜索算法解决八数码问题(C语言).doc_第2页
第2页 / 共9页
启发式搜索算法解决八数码问题(C语言).doc_第3页
第3页 / 共9页
启发式搜索算法解决八数码问题(C语言).doc_第4页
第4页 / 共9页
启发式搜索算法解决八数码问题(C语言).doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、1、程序源代码#include #includestruct nodeint a33;/用二维数组存放 8 数码int hx;/函数 h(x)的值,表示与目标状态的差距struct node *parent;/指向父结点的指针struct node *next;/指向链表中下一个结点的指针;/-hx 函数-/int hx(int s33)/函数说明:计算 s 与目标状态的差距值int i,j;int hx=0;int sg33=1,2,3,8,0,4,7,6,5;for(i=0;inext=NULL;/初始化for(i=0;iaij=0)flag=1;break;if(flag=1)break

2、;for(m=0;ma 赋给 xfor(n=0;namn;/根据 0 的位置的不同,对 x 进行相应的变换/情况 1if(i-1=0)t=xij;xij=xi-1j;xi-1j=t;flag=0;for(m=0;mparent-amn)flag+;if(flag!=9)q=(node *)malloc(sizeof(node);for(m=0;mamn=xmn;q-parent=ex;q-hx=hx(q-a); q-next=NULL;p-next=q;p=p-next;/情况 2for(m=0;ma 重新赋给 x,即还原 xfor(n=0;namn;if(i+1parent-amn)flag

3、+;if(flag!=9)q=(node *)malloc(sizeof(node);for(m=0;mamn=xmn;q-parent=ex;q-hx=hx(q-a); q-next=NULL;p-next=q;p=p-next;/情况 3for(m=0;ma 重新赋给 x,即还原 xfor(n=0;namn;if(j-1=0) t=xij;xij=xij-1;xij-1=t;flag=0;for(m=0;mparent-amn)flag+;if(flag!=9)q=(node *)malloc(sizeof(node);for(m=0;mamn=xmn;q-parent=ex;q-hx=h

4、x(q-a); q-next=NULL;p-next=q;p=p-next;/情况 4for(m=0;ma 重新赋给 x,即还原 xfor(n=0;namn;if(j+1parent-amn)flag+;if(flag!=9)q=(node *)malloc(sizeof(node);for(m=0;mamn=xmn;q-parent=ex;q-hx=hx(q-a); q-next=NULL;p-next=q;p=p-next;head=head-next;return head;/-extend 函数 end-/-insert 函数-/ node* insert(node *open,nod

5、e * head) /函数说明:将 head 链表的结点依次插入到 open 链表相应的位置,/使 open 表中的结点按从小到大排序。函数返回 open 指针node *p,*q;/p、q 均指向 open 表中的结点,p 指向 q 所指的前一个结点int i,j;int flag=0;if(open=NULL)/初始状态,open 表为空 /首先将 head 表第一个结点直接放入 open 表中open=head;q=head;head=head-next;q-next=NULL;/再插入第二个结点if(head-hxhx)/插入到首结点位置open=head;head=head-next

6、;open-next=q;else /或者第二个结点的位置q-next=head;head=head-next;q=q-next;q-next=NULL;p=open;p=open;q=open-next; /end ifwhile(head!=NULL)q=open;if(head-hxhx) /插入到表头open=head;head=head-next;open-next=q;continue;else q=q-next;p=open; /否则,q 指像第二个结点, p 指向 q 前一个结点while(q-next!=NULL) /将 head 的一个结点插入到链表中(非表尾的位置)if(

7、q-hxhx) q=q-next;p=p-next;elsep-next=head;head=head-next;p-next-next=q;break;if(q-next=NULL)/将 head 的一个结点插入到表尾if(q-hxhead-hx)p-next=head;head=head-next;p-next-next=q;elseq-next=head;head=head-next;q-next-next=NULL;/if/whilereturn open;/insert/-insert 函数 end-/-main-/ void main()int i,j;node s0;node *

8、open,*close;node *p,*q;node *newlist;printf(“请输入初始状态的 8 数码(按每行从左往右依次输入,用 0 表示空格):n“);for(i=0;ihx=9;s0.hx=hx(s0.a);open=p=if(open-hx=0)printf(“该状态已为最终状态!n“);return;q=close=open=NULL;newlist=extend(q);/newlist 指向新扩展出来的链表open=insert(open,newlist);/将扩展出来的结点插入到 open 表中while(1)q-next=open;/q 始终指向 close 表尾

9、结点。将 open 表的第一个元素加到 close 表open=open-next;q=q-next;q-next=NULL;if(q-hx=0)printf(“n 搜索成功!n“);break;newlist=extend(q);/对 close 表最后一个结点进行扩展,扩展得到的链表接到 open表尾open=insert(open,newlist);/将扩展的结点按顺序插入到 open 表中p=close;printf(“择优搜索过程如下:n“);while(p!=NULL) for(i=0;iaij);printf(“n“);printf(“n“);p=p-next;2、程序运行结果截图截图 1: 初始态为:2 8 31 47 6 5运行结果如右图所示: 截图 2:初始状态为 2 8 3 时,程序运行结果如下:1 6 47 5

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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