深度宽度优先搜索八数码Word文档下载推荐.docx

上传人:b****1 文档编号:14072126 上传时间:2022-10-18 格式:DOCX 页数:18 大小:96.57KB
下载 相关 举报
深度宽度优先搜索八数码Word文档下载推荐.docx_第1页
第1页 / 共18页
深度宽度优先搜索八数码Word文档下载推荐.docx_第2页
第2页 / 共18页
深度宽度优先搜索八数码Word文档下载推荐.docx_第3页
第3页 / 共18页
深度宽度优先搜索八数码Word文档下载推荐.docx_第4页
第4页 / 共18页
深度宽度优先搜索八数码Word文档下载推荐.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

深度宽度优先搜索八数码Word文档下载推荐.docx

《深度宽度优先搜索八数码Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《深度宽度优先搜索八数码Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。

深度宽度优先搜索八数码Word文档下载推荐.docx

{

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1