题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1195
思路1:单项BFS
三个方向:加1,减1,相邻交换,其中9+1=1,1-1=9,最左边不与最右边相邻
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int num[4],step;
};
node first,last;
bool visit[10][10][10][10],flag;
void bfs()
{
int i;
node p,q;
queue<node> Q;
memset(visit,false,sizeof(visit));
flag=true;
first.step=0;
p=first;
visit[p.num[0]][p.num[1]][p.num[2]][p.num[3]]=true;
Q.push(p);
while(!Q.empty())
{
p=Q.front();Q.pop();
flag=true;
for(i=0;i<4;i++)
if(p.num[i]!=last.num[i])
{
flag=false;
break;
};
if(flag)
{
printf("%d\n",p.step);
return;
}
for(i=0;i<4;i++)//+1
{
q=p;
if(p.num[i]==9) q.num[i]=1;
else q.num[i]=p.num[i]+1;
q.step=p.step+1;
if(!visit[q.num[0]][q.num[1]][q.num[2]][q.num[3]])
{
visit[q.num[0]][q.num[1]][q.num[2]][q.num[3]]=true;
Q.push(q);
}
}
for(i=0;i<4;i++)//-1
{
q=p;
if(p.num[i]==1) q.num[i]=9;
else q.num[i]=p.num[i]-1;
q.step=p.step+1;
if(!visit[q.num[0]][q.num[1]][q.num[2]][q.num[3]])
{
visit[q.num[0]][q.num[1]][q.num[2]][q.num[3]]=true;
Q.push(q);
}
}
for(i=0;i<3;i++)//相邻交换
{
q=p;
q.num[i]=p.num[i+1];
q.num[i+1]=p.num[i];
q.step=p.step+1;
if(!visit[q.num[0]][q.num[1]][q.num[2]][q.num[3]])
{
visit[q.num[0]][q.num[1]][q.num[2]][q.num[3]]=true;
Q.push(q);
}
}
}
}
int main()
{
int cas,i;
char chf[5],chl[5];
scanf("%d",&cas);
while(cas--)
{
scanf("%s%s",chf,chl);
for(i=0;i<4;i++)
{
first.num[i]=chf[i]-'0';
last.num[i]=chl[i]-'0';
}
bfs();
}
return 0;
}
思路2:双向BFS
分别从两头一层一层搜索,相遇时输出答案并跳出搜索
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int a[4],step;
};
int v1[10][10][10][10],v2[10][10][10][10];
node ft,lt;
void bbfs()
{
int i,k,temp1,temp2;
node qf, ql, pf, pl;
queue<node> Q1, Q2;
ft.step=0; pf=ft;
lt.step=0; pl=lt;
memset(v1,-1,sizeof(v1));
memset(v2,-1,sizeof(v2));
v1[pf.a[0]][pf.a[1]][pf.a[2]][pf.a[3]]=0;
v2[pl.a[0]][pl.a[1]][pl.a[2]][pl.a[3]]=0;
Q1.push(pf), Q2.push(pl);
temp1=temp2=0;
while(1)
{
while(!Q1.empty()&&Q1.front().step==temp1)//正搜
{
pf=Q1.front(); Q1.pop();
if((k=v2[pf.a[0]][pf.a[1]][pf.a[2]][pf.a[3]])!=-1)//判断是否反搜过
{
printf("%d\n",pf.step+k);
return;
}
for(i=0;i<4;i++)//+1;
{
qf=pf;
if(pf.a[i]==9) qf.a[i]=1;
else qf.a[i]=pf.a[i]+1;
qf.step=pf.step+1;
if((k=v2[qf.a[0]][qf.a[1]][qf.a[2]][qf.a[3]])!=-1)//判断是否反搜过
{
printf("%d\n",qf.step+k);
return;
}
if(v1[qf.a[0]][qf.a[1]][qf.a[2]][qf.a[3]]==-1)
{
v1[qf.a[0]][qf.a[1]][qf.a[2]][qf.a[3]]=qf.step;
Q1.push(qf);
}
}
for(i=0;i<4;i++)//-1;
{
qf=pf;
if(pf.a[i]==1) qf.a[i]=9;
else qf.a[i]=pf.a[i]-1;
qf.step=pf.step+1;
if((k=v2[qf.a[0]][qf.a[1]][qf.a[2]][qf.a[3]])!=-1)
{
printf("%d\n",qf.step+k);
return;
}
if(v1[qf.a[0]][qf.a[1]][qf.a[2]][qf.a[3]]==-1)
{
v1[qf.a[0]][qf.a[1]][qf.a[2]][qf.a[3]]=qf.step;
Q1.push(qf);
}
}
for(i=0;i<3;i++)
{
qf=pf;
qf.a[i]=pf.a[i+1];
qf.a[i+1]=pf.a[i];
qf.step=pf.step+1;
if((k=v2[qf.a[0]][qf.a[1]][qf.a[2]][qf.a[3]])!=-1)
{
printf("%d\n",qf.step+k);
return;
}
if(v1[qf.a[0]][qf.a[1]][qf.a[2]][qf.a[3]]==-1)
{
v1[qf.a[0]][qf.a[1]][qf.a[2]][qf.a[3]]=qf.step;
Q1.push(qf);
}
}
}
temp1=Q1.front().step;
while(!Q2.empty()&&Q2.front().step==temp2)//反搜;
{
pl=Q2.front();Q2.pop();
if((k=v1[pl.a[0]][pl.a[1]][pl.a[2]][pl.a[3]])!=-1)
{
printf("%d\n",pl.step+k);
return;
}
for(i=0;i<4;i++)//+1;
{
ql=pl;
if(pl.a[i]==9) ql.a[i]=1;
else ql.a[i]=pl.a[i]+1;
ql.step=pl.step+1;
if((k=v1[ql.a[0]][ql.a[1]][ql.a[2]][ql.a[3]])!=-1)
{
printf("%d\n",ql.step+k);
return;
}
if(v2[ql.a[0]][ql.a[1]][ql.a[2]][ql.a[3]]==-1)
{
v2[ql.a[0]][ql.a[1]][ql.a[2]][ql.a[3]]=ql.step;
Q2.push(ql);
}
}
for(i=0;i<4;i++)//-1;
{
ql=pl;
if(pl.a[i]==1) ql.a[i]=9;
else ql.a[i]=pl.a[i]-1;
ql.step=pl.step+1;
if((k=v1[ql.a[0]][ql.a[1]][ql.a[2]][ql.a[3]])!=-1)
{
printf("%d\n",ql.step+k);
return;
}
if(v2[ql.a[0]][ql.a[1]][ql.a[2]][ql.a[3]]==-1)
{
v2[ql.a[0]][ql.a[1]][ql.a[2]][ql.a[3]]=ql.step;
Q2.push(ql);
}
}
for(i=0;i<3;i++)//相邻交换
{
ql=pl;
ql.a[i]=pl.a[i+1];
ql.a[i+1]=pl.a[i];
ql.step=pl.step+1;
if((k=v1[ql.a[0]][ql.a[1]][ql.a[2]][ql.a[3]])!=-1)
{
printf("%d\n",ql.step+k);
return;
}
if(v2[ql.a[0]][ql.a[1]][ql.a[2]][ql.a[3]]==-1)
{
v2[ql.a[0]][ql.a[1]][ql.a[2]][ql.a[3]]=ql.step;
Q2.push(ql);
}
}
}
temp2=Q2.front().step;
}
}
int main()
{
int cas,i;
char chf[5],chl[5];
scanf("%d",&cas);
while(cas--)
{
scanf("%s%s",chf,chl);
for(i=0;i<4;i++)
{
ft.a[i]=chf[i]-'0';
lt.a[i]=chl[i]-'0';
}
bbfs();
}
return 0;
}