深度宽度优先搜索八数码Word文档下载推荐.docx
- 文档编号:14072126
- 上传时间:2022-10-18
- 格式:DOCX
- 页数:18
- 大小:96.57KB
深度宽度优先搜索八数码Word文档下载推荐.docx
《深度宽度优先搜索八数码Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《深度宽度优先搜索八数码Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
{
charx;
//位置x和位置y上的数字换位
chary;
//其中x是0所在的位置
}EP_MOVE;
#defineSIZE3//8数码问题,理论上本程序也可解决15数码问题,
#defineNUMSIZE*SIZE//但move_gen需要做很多修改,输入初始和结束状态的部分和check_input也要修改
#defineMAX_NODE1000000
#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]=ttt&
0xf;
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>
pz--)
{if((node->
v&
t)==0)
{break;
//找到0的位置
}
t<
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[1].x=2;
move[1].y=5;
case3:
move[0].x=3;
move[1].x=3;
move[1].y=6;
move[2].x=3;
case4:
move[0].x=4;
move[1].x=4;
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;
case6:
move[0].x=6;
move[0].y=3;
move[1].x=6;
move[1].y=7;
case7:
move[0].x=7;
move[0].y=6;
move[1].x=7;
move[2].x=7;
case8:
move[0].x=8;
move[0].y=5;
move[1].x=8;
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);
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;
v<
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->
q->
v)
{q->
big=&
m_ar[r];
small=&
return1;
/*得到节点所在深度*/
longget_node_depth(EP_NODE*node)
{longd=0;
while(node->
prev)
{d++;
node=node->
returnd;
/*返回值:
成功-返回搜索节点数,节点数不够-(-1),无解-(-2)*/
longbfs_search(char*begin,char*end)
{longh=0,r=1,c,i,j;
EP_NODEl_end,node,*pnode;
EP_MOVEmv[4];
//每个局面最多4种走法
TRANS(begin,m_ar[0].v);
TRANS(end,l_end.v);
m_ar[0].prev=NULL;
m_root=m_ar;
m_root->
small=NULL;
big=NULL;
while((h<
r)&
&
(r<
MAX_NODE-4))
{c=move_gen(&
m_ar[h],mv);
for(i=0;
i<
c;
i++)
{mov(&
m_ar[h],&
mv[i],&
node);
node.prev=&
m_ar[h];
if(node.v==l_end.v)
{pnode=&
node;
j=0;
while(pnode->
{m_out[j]=*pnode;
j++;
pnode=pnode->
m_depth=j;
returnr;
if(add_node(&
node,r))r++;
//只能对历史节点中没有的新节点搜索,否则会出现环
h++;
printf("
\rSearch...%9d/%d@%d"
h,r,get_node_depth(&
m_ar[h]));
if(h==r)
{return-2;
else
{return-1;
longcheck_input(char*s,chara,longr)
{longi;
r;
{if(s[i]==a-0x30)return0;
longcheck_possible(char*begin,char*end)
{charfs;
longf1=0,f2=0;
longi,j;
{fs=0;
for(j=0;
j<
i;
j++)
if((begin[i]!
=0)&
(begin[j]!
(begin[j]<
begin[i]))fs++;
f1+=fs;
fs=0;
{if((end[i]!
(end[j]!
(end[j]<
end[i]))fs++;
f2+=fs;
if((f1&
1)==(f2&
1))return1;
voidoutput(void)
{longi,j,k;
for(i=m_depth-1;
i>
i--)
{RTRANS(m_out[i].v,ss);
SIZE;
{for(k=0;
k<
k++)
{printf("
%2d"
ss[SIZE*j+k]);
\n"
);
intmain(void)
{chars1[NUM];
chars2[NUM];
longr;
chara;
请输入开始状态:
"
r=0;
while(r<
NUM)
{a=getchar();
if(a>
=0x30&
a<
0x39&
check_input(s1,a,r))
{s1[r++]=a-0x30;
%c"
a);
\n请输入结束状态:
check_input(s2,a,r))
{s2[r++]=a-0x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深度 宽度 优先 搜索 数码