启发式搜索解决八数码问题

启发式搜索解决八数码问题

ID:36309929

大小:22.34 KB

页数:7页

时间:2019-05-09

启发式搜索解决八数码问题_第1页
启发式搜索解决八数码问题_第2页
启发式搜索解决八数码问题_第3页
启发式搜索解决八数码问题_第4页
启发式搜索解决八数码问题_第5页
资源描述:

《启发式搜索解决八数码问题》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、#include#include#includetypedefstructNode{//节点结构体intdata[9];doublef,g;structNode*parent;}Node,*Lnode;typedefstructStack{//OPENCLOSED表结构体Node*npoint;structStack*next;}Stack,*Lstack;Node*Minf(Lstack*Open){//选取OPEN表上f值最小的节点,返回该

2、节点地址Lstacktemp=(*Open)->next,min=(*Open)->next,minp=(*Open);Node*minx;while(temp->next!=NULL){if((temp->next->npoint->f)<(min->npoint->f)){min=temp->next;minp=temp;}temp=temp->next;}minx=min->npoint;temp=minp->next;minp->next=minp->next->next;free(tem

3、p);returnminx;}intCanslove(Node*suc,Node*goal){//判断是否可解inta=0,b=0,i,j;for(i=1;i<9;i++)for(j=0;jdata[i]>suc->data[j])&&suc->data[j]!=0)a++;if((goal->data[i]>goal->data[j])&&goal->data[j]!=0)b++;}if(a%2==b%2)return1;elsereturn0;}intEqua

4、l(Node*suc,Node*goal){//判断节点是否相等,相等,不相等for(inti=0;i<9;i++)if(suc->data[i]!=goal->data[i])return0;return1;}Node*Belong(Node*suc,Lstack*list){//判断节点是否属于OPEN表或CLOSED表,是则返回节点地址,否则返回空地址Lstacktemp=(*list)->next;if(temp==NULL)returnNULL;while(temp!=NULL){if(

5、Equal(suc,temp->npoint))returntemp->npoint;temp=temp->next;}returnNULL;}voidPutinto(Node*suc,Lstack*list){//把节点放入OPEN或CLOSED表中Stack*temp;temp=(Stack*)malloc(sizeof(Stack));temp->npoint=suc;temp->next=(*list)->next;(*list)->next=temp;}///////////////计算

6、f值部分-开始//////////////////////////////doubleFvalue(Nodesuc,Nodegoal,floatspeed){//计算f值doubleDistance(Node,Node,int);doubleh=0;for(inti=1;i<=8;i++)h=h+Distance(suc,goal,i);returnh*speed+suc.g;//f=h+g;(speed值增加时搜索过程以找到目标为优先因此可能不会返回最优解)}doubleDistance(Nod

7、esuc,Nodegoal,inti){//计算方格的错位距离intk,h1,h2;for(k=0;k<9;k++){if(suc.data[k]==i)h1=k;if(goal.data[k]==i)h2=k;}returndouble(fabs(h1/3-h2/3)+fabs(h1%3-h2%3));}///////////////计算f值部分-结束/////////////////////////////////////////////////////扩展后继节点部分的函数-开始//////

8、///////////intBelongProgram(Lnode*suc,Lstack*Open,Lstack*Closed,Nodegoal,floatspeed){//判断子节点是否属于OPEN或CLOSED表并作出相应的处理Node*temp=NULL;intflag=0;if((Belong(*suc,Open)!=NULL)

9、

10、(Belong(*suc,Closed)!=NULL)){if(Belong(*suc,Open)!=NULL)temp=Belong(*suc

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。