ImageVerifierCode 换一换
格式:DOC , 页数:9 ,大小:108KB ,
资源ID:7622588      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-7622588.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(启发式搜索算法解决八数码问题(C语言).doc)为本站会员(j35w19)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

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

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营业执照举报