深度宽度优先搜索八数码

八数码问题具体思路:宽度优先算法实现过程(1)把起始节点放到OPEN表中;(2)如果OPEN是个空表,则没有解,失败退出;否则继续;(3)把第一个节点从OPEN表中移除,并把它放入CLOSED的扩展节点表中;(4)扩展节点n。如果没有后继节点,则转向(2)(5)把n的所有后继结点放到OPEN表末端,并提供从这些后继结点回到n的指针;(6)如果n的任意一个后继结点是目标节点,则找到一个解答,成功退出,否则转向(2)。深度优先实现过程(1)把起始节点S放入未扩展节点OPEN表中。如果此节点为一目标节点,则得到一个解;(2)如果OPEN为一空表,则失败退出;(3)把第一个节点从OPEN表移到CLOSED表;(4)如果节点n的深度等于最大深度,则转向(2);(5)扩展节点n,产生其全部后裔,并把它们放入OPEN表的前头。如果没有后裔,则转向(2);(6)如果后继结点中有任一个目标节点,则得到一个解,成功退出,否则转向(2)。开始把S放入OPEN表OPEN表为空失败把第一个节点n从把S放入OPEN表移除,放到CLOSED表中移除扩展n,把它的后继节点放入OPEN表的末端,提供回到n的指针是否任何节点为目标节点成功方法一:用C语言实现#include<stdio.h>#include<string.h>#include<stdlib.h>typedeflongUINT64;typedefstruct{charx;//位置x和位置y上的数字换位chary;//其中x是0所在的位置}EP_MOVE;#defineSIZE3//8数码问题,理论上本程序也可解决15数码问题,#defineNUMSIZE*SIZE//但move_gen需要做很多修改,输入初始和结束状态的部分和check_input也要修改#defineMAX_NODE1000000开始把S放入OPEN表S是否为目标节点成功把第一个节点n从把S放入OPEN表移除,放到CLOSED表中移除节点n的深度是否等于最深界限OPEN表为空失败扩展n,把它的后继放入OPEN表的前头,提供回到n的指针是否有任何后继节点为目标节点成功#defineMAX_DEP100#defineXCHG(a,b){a=a+b;b=a-b;a=a-b;}#defineTRANS(a,b)/*{longiii;(b)=0;for(iii=0;iii<NUM;iii++)(b)=((b)<<4)+a[iii];}*///将数组a转换为一个64位的整数b#defineRTRANS(a,b)\{\longiii;\UINT64ttt=(a);\for(iii=NUM-1;iii>=0;iii--)\{\b[iii]=ttt0xf;\ttt>>=4;\}\}//将一个64位整数a转换为数组b//typedefstructEP_NODE_Tag{UINT64v;//保存状态,每个数字占4个二进制位,可解决16数码问题structEP_NODE_Tag*prev;//父节点structEP_NODE_Tag*small,*big;}EP_NODE;EP_NODEm_ar[MAX_NODE];EP_NODE*m_root;longm_depth;//搜索深度EP_NODEm_out[MAX_DEP];//输出路径//longmove_gen(EP_NODE*node,EP_MOVE*move){longpz;//0的位置UINT64t=0xf;for(pz=NUM-1;pz>=0;pz--){if((node->vt)==0){break;//找到0的位置}t<<=4;}switch(pz){case0:move[0].x=0;move[0].y=1;move[1].x=0;move[1].y=3;return2;case1:move[0].x=1;move[0].y=0;move[1].x=1;move[1].y=2;move[2].x=1;move[2].y=4;return3;case2:move[0].x=2;move[0].y=1;move[1].x=2;move[1].y=5;return2;case3:move[0].x=3;move[0].y=0;move[1].x=3;move[1].y=6;move[2].x=3;move[2].y=4;return3;case4:move[0].x=4;move[0].y=1;move[1].x=4;move[1].y=3;move[2].x=4;move[2].y=5;move[3].x=4;move[3].y=7;return4;case5:move[0].x=5;move[0].y=2;move[1].x=5;move[1].y=4;move[2].x=5;move[2].y=8;return3;case6:move[0].x=6;move[0].y=3;move[1].x=6;move[1].y=7;return2;case7:move[0].x=7;move[0].y=6;move[1].x=7;move[1].y=4;move[2].x=7;move[2].y=8;return3;case8:move[0].x=8;move[0].y=5;move[1].x=8;move[1].y=7;return2;}return0;}longmov(EP_NODE*n1,EP_MOVE*mv,EP_NODE*n2)//走一步,返回走一步后的结果{charss[NUM];RTRANS(n1->v,ss);XCHG(ss[mv->x],ss[mv->y]);TRANS(ss,n2->v);return0;}longadd_node(EP_NODE*node,longr){EP_NODE*p=m_root;EP_NODE*q;while(p){q=p;if(p->v==node->v)return0;elseif(node->v>p->v)p=p->big;elseif(node->v<p->v)p=p->small;}m_ar[r].v=node->v;m_ar[r].prev=node->prev;m_ar[r].small=NULL;m_ar[r].big=NULL;if(node->v>q->v){q->big=m_ar[r];}elseif(...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

文秘专家
机构认证
内容提供者

1

确认删除?