就是BFS。
考虑每个状态,并且记录是否被搜索过。
不过只有1—9.没有0.
每一位+-1.或者相邻的交换。
额。我的代码比较臃肿,不过很好理解。
#include<stdio.h>
#include<string.h>
int top,end,ans,q[100001],a,b;
short vis[10001];
int bfs()
{
int i,a1,a2,a3,a4,t;
q[end]=q[top]=a;
while(1)
{
for(i=end;i<=top;i++)
if(q[i]==b)return 1;
for(i=top;end<=i;end++)
{
a1=q[end]/1000,a2=q[end]/100%10;
a3=q[end]/10%10,a4=q[end]%10;
if(a1==9)
{
t=1000+a2*100+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=8000+a2*100+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
else if(a1==1)
{
t=2000+a2*100+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=9000+a2*100+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
else
{
t=(a1-1)*1000+a2*100+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=(a1+1)*1000+a2*100+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
if(a2==9)
{
t=a1*1000+100+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+800+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
else if(a2==1)
{
t=a1*1000+200+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+900+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
else
{
t=a1*1000+(a2+1)*100+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+(a2-1)*100+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
if(a3==9)
{
t=a1*1000+a2*100+80+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+a2*100+10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
else if(a3==1)
{
t=a1*1000+a2*100+20+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+a2*100+90+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
else
{
t=a1*1000+a2*100+(a3+1)*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+a2*100+(a3-1)*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
if(a4==9)
{
t=a1*1000+a2*100+a3*10+1;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+a2*100+a3*10+8;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
else if(a4==1)
{
t=a1*1000+a2*100+a3*10+2;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+a2*100+a3*10+9;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
else
{
t=a1*1000+a2*100+a3*10+a4-1;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+a2*100+a3*10+a4+1;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
t=a2*1000+a1*100+a3*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+a3*100+a2*10+a4;
if(!vis[t])
q[++top]=t,vis[t]=1;
t=a1*1000+a2*100+a4*10+a3;
if(!vis[t])
q[++top]=t,vis[t]=1;
}
ans++;
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
while(n-->0)
{
scanf("%d%d",&a,&b);
top=end=ans=0;
memset(vis,0,sizeof(vis));
bfs();
printf("%d\n",ans);
}
}
}