用广搜解决八数码问题.ppt
上传人:天马****23 上传时间:2024-09-10 格式:PPT 页数:33 大小:2.1MB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

用广搜解决八数码问题.ppt

用广搜解决八数码问题.ppt

预览

免费试读已结束,剩余 23 页请下载文档后查看

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

内容提要枚举枚举搜索例题:POJ1077八数码问题例题:POJ1077八数码问题广度优先搜索广度优先搜索广度优先搜索深度优先搜索深度优先搜索深度优先搜索深度优先搜索判重判重判重判重判重判重输入数据:23415x768输出结果:ullddrurdllurdruldr//本程序在ai上会超内存,在acm上能过#include<iostream>usingnamespacestd;intnGoalStatus;//目标状态unsignedcharszFlag[48427562];//节点是否扩展的标记charszResult[1000000];charszMoves[1000000];//移动步骤intanFather[1000000];//父节点指针intMyQueue[1000000];//状态队列intnQHead;intnQTail;charsz4Moves[]="udrl";//四种动作intNineToTen(char*s)//九进制字符串转十进制{intnResult=0;for(inti=0;s[i];i++){nResult*=9;nResult+=s[i]-'0';}returnnResult;}intGetBit(unsignedcharc,intn){return(c>>n)&1;}voidSetBit(unsignedchar&c,intn,intv){if(v)c|=(1<<n);elsec&=~(1<<n);}intTenToNine(intn,char*s)//十进制数转九进制字符串。可能有前导0//返回0的位置{intnZeroPos;intnBase=1;intj=0;while(nBase<=n)nBase*=9;nBase/=9;do{s[j]=n/nBase+'0';if(s[j]=='0')nZeroPos=j;j++;n%=nBase;nBase/=9;}while(nBase>=1);s[j]=0;//判是否要加前导0if(j<9){for(inti=j+1;i>0;i--)s[i]=s[i-1];s[0]='0';return0;}returnnZeroPos;}intNewStatus(intnStatus,charcMove)//求从nStatus经过cMove移动后得到的新状态//若移动不可行则返回-1{charszTmp[20];intnZeroPos=TenToNine(nStatus,szTmp);switch(cMove){case'u':if(nZeroPos-3<0)return-1;else{szTmp[nZeroPos]=szTmp[nZeroPos-3];szTmp[nZeroPos-3]='0';}break;case'd':if(nZeroPos+3>8)return-1;else{szTmp[nZeroPos]=szTmp[nZeroPos+3];szTmp[nZeroPos+3]='0';}break;case'l':if(nZeroPos%3==0)return-1;else{szTmp[nZeroPos]=szTmp[nZeroPos-1];szTmp[nZeroPos-1]='0';}break;case'r':if(nZeroPos%3==2)return-1;else{szTmp[nZeroPos]=szTmp[nZeroPos+1];szTmp[nZeroPos+1]='0';}break;}returnNineToTen(szTmp);}boolBfs(intnStatus){intnNewStatus;nQHead=0;nQTail=1;MyQueue[nQHead]=nStatus;while(nQHead!=nQTail){//队列不为空nStatus=MyQueue[nQHead];if(nStatus==nGoalStatus){//找到目标状态returntrue;}for(inti=0;i<4;i++){//尝试4种移动nNewStatus=