⼋数码问题宽度优先搜索c语⾔,启发式搜索算法解决⼋数码问
题(C语⾔)
《启发式搜索算法解决⼋数码问题(C语⾔)》由会员分享,可在线阅读,更多相关《启发式搜索算法解决⼋数码问题(C语⾔)(12页珍藏版)》请在⼈⼈⽂库⽹上搜索。
1、精选⽂档 1、程序源代码 #include #include struct node int a33;/ ⽤⼆维数组存放 8数码 int hx;/函数h (X)的值,表⽰与⽬标状态的差距 struct n ode *p are nt;/指向⽗结点的指针 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;i3;i+) for(j=0;jnext=NULL;/ 初始化 for(i=0;i。
2、3;i+)/ 到⼆维数组中 0 的位置 for(j=0;jaij=0) flag=1; break; if(flag=1) break; for(m=0;ma 赋给 x for(n=0;namn; /根据 0的位置的不同,对 x 进⾏相应的变换 /情况 1 if(i-1=0) t=xij;xij=xi-1j;xi-1j=t; flag=0; for(m=0;m3;m+)/ 将 x 赋给 a for(n=0;nparent-amn) flag+; if(flag!=9) q=(node *)malloc(sizeof(node); for(m=0;m3;m+)/ 将 x 赋给 a for(n=。
3、0;namn=xmn; q-parent=ex; q-hx=hx(q-a); q-next=NULL; p-next=q; p=p-next; /情况 2 for(m=0;ma 重新赋给 x,即还原 x
for(n=0;namn; if(i+1=2) t=xij;xij=xi+1j;xi+1j=t; flag=0; for(m=0;m3;m+) for(n=0;nparent-amn) flag+; if(flag!=9) q=(node *)malloc(sizeof(node); for(m=0;m3;m+)/ 将 x 赋给 a for(n=0;namn=xmn; q-parent=ex;。
4、 q-hx=hx(q-a); q-next=NULL; p-next=q; p=p-next; /情况 3 for(m=0;ma 重新赋给 x,即还原 x for(n=0;namn; if(j-1=0)
t=xij;xij=xij-1;xij-1=t; flag=0; for(m=0;m3;m+) for(n=0;nparent-amn) flag+; if(flag!=9) q=(node *)malloc(sizeof(node);
for(m=0;m3;m+)/ 将 x 赋给 a for(n=0;namn=xmn; q-parent=ex; q-hx=hx(q-a); q-next=NU。
5、LL; p-next=q; p=p-next; /情况 4 for(m=0;ma 重新赋给 x,即还原 x for(n=0;namn; if(j+1=2) t=xij;xij=xij+1;xij+1=t; flag=0;
for(m=0;m3;m+) for(n=0;nparent-amn) flag+; if(flag!=9) q=(node *)malloc(sizeof(node); for(m=0;m3;m+)
for(n=0;namn=xmn; q-parent=ex; q-hx=hx(q-a); q-next=NULL; p-next=q; p=p-next; head=head-。
6、next; return head; / extend 函数 end / /insert 函数 node* insert(node *open,node * head) / 函数说明:将 head 链表的结点依次插⼊到 open 链表相应的位置, /使open表中的结点按从⼩到⼤排序。函数返回open指针 / node *p,*q;/p 、 q 均指向 open 表中的结点, p 指向 q 所指的前⼀个结点 int i,j; int flag=0; if(open=NULL)/ 初始状态, open 表为空 II⾸先将head表第⼀个结点直接放⼊open 表中 open=head; q=head。
7、; head=head-next; q-next=NULL; 再插⼊第⼆个结点 if(head-hxhx) II 插⼊到⾸结点位置 open=head; head=head-next; open-next=q; else II 或者第⼆个结点的位置 q-next=head; head=head-next; q=q-next; q-next=NULL; p=open; p=open; q=open-next; IIend if while(head!=NULL) q=open; if(head-hxhx) II 插⼊到表头 open=head; head=head-next; open-next。
8、=q; continue; else q=q-next;p=open; II否则,q指像第⼆个结点,p指向q前⼀个结点 while(q-next!=NULL) / 将 head 的⼀个结点插⼊到链表中(⾮表尾的位置) if(q-hxhx) q=q-next; p=p-next; else p-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; else q-ne。
9、xt=head; head=head-next; q-next-next=NULL; /if /while return open; /insert insert 函数 end / / mai
n void main() int i,j; node s0; node *open,*close; node *p,*q; node *newlist; 精选⽂档 11 表尾 printf( 请输⼊初始状态的 8 数码(按每⾏从左往右依次输⼊,⽤ 0 表⽰空格): for(i=0;i3;i+) for(j=0;jhx=9; s0.hx=hx(s0.a); open= p= if(open-hx=0) 。
c语言listinsert函数
10、printf( 该状态已为最终状态! n); return; q= close= open=NULL; newlist=extend(q);/newlist 指向新扩展出来的链表
open=insert(open,newlist);/ 将扩展出来的结点插⼊到 open 表中 n); while(1) q-next=open;/q 始终指向 close 表尾结点。将 open 表的第⼀个元素加到 open=open-next; q=q-next; q-next=NULL; if(q-hx=0) close 表 printf(n 搜索成功! n); break;
newlist=extend(q)。
11、;/ 对 close 表最后⼀个结点进⾏扩展,扩展得到的链表接到 open open=insert(open,newlist);/ 将扩展的结点按顺序插⼊到 open 表中 P=close; printf(”择优搜索过程如下:n); while( p!=NULL) for(i=0;i3;i+) for(j=0;jaij); prin tf(n); prin tf(n); p=p-n ext; nf ri 2、程序运⾏结果截图 截图1: 初始态为: 2 1 7 运⾏结果如 右图所⽰: t f| 馨SS奎k程如下: S 5 6 IM 截图2: 初始状态为2 1 7 8 3时,程序运⾏结果如下: 6 4 5 | 请输⼊初始状态的8数码技507.⽤弱表⽰空格)t 2 5 3 1 6 4 7 SI翹翼t程如下I S G Q 2 1 7 3 4 5 3 0 4 2 1 7 Q 8 6 3 4 5 0 1 7 2 8 6 3 4 5 2 8 6 3 4 5 1 8 7 2 Q 6 3 4 5 II Press Niry key to ca
ntinu.e。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。