双端BFS
/*************************************************************************
> File Name: 2.cpp
> Author:yuan
> Mail:
> Created Time: 2014年11月25日 星期二 23时33分09秒
***********************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
int mat[4];
int sum;
};
int ans;
node q1[10005],q2[10005];
int t;
int top1,top2,base1,base2;
int vis1[10005],vis2[10005];
void copy1(node &s1,node s2)
{
for(int i=0;i<4;i++)
{
s1.mat[i]=s2.mat[i];
}
}
bool check1(node n1)
{
int num=0;
num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
if(vis1[num]) return 0;
else return 1;
}
bool check2(node n2)
{
int num=0;
num=n2.mat[0]*1000+n2.mat[1]*100+n2.mat[2]*10+n2.mat[3];
if(vis2[num]) return 0;
else return 1;
}
void BFS()
{
node n1;int ll=1;
while(base1<top1||base2<top2)
{
int ans1;
if(base1<top1){
for(int i=0;i<7;i++)
{
if(i<4){
copy1(n1,q1[base1]);
if(n1.mat[i]==9) n1.mat[i]=1;
else n1.mat[i]+=1;
if(check1(n1)){
copy1(q1[top1],n1);
q1[top1].sum=q1[base1].sum+1;
top1++;
int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
vis1[num]=top1-1;
if(vis2[num]) {ans1=q1[top1-1].sum+q2[vis2[num]].sum;ans=min(ans,ans1);}
}
copy1(n1,q1[base1]);
if(n1.mat[i]==1) n1.mat[i]=9;
else n1.mat[i]-=1;
if(check1(n1)){
copy1(q1[top1],n1);
q1[top1].sum=q1[base1].sum+1;
top1++;
int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
vis1[num]=top1-1;
if(vis2[num]) {ans1=q1[top1-1].sum+q2[vis2[num]].sum;ans=min(ans,ans1);}
}
}
else
{
int k=i-4;
copy1(n1,q1[base1]);
int d=n1.mat[k];
n1.mat[k]=n1.mat[k+1],n1.mat[k+1]=d;
if(check1(n1)){
copy1(q1[top1],n1);
q1[top1].sum=q1[base1].sum+1;
top1++;
int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
vis1[num]=top1-1;
if(vis2[num]) {ans1=q1[top1-1].sum+q2[vis2[num]].sum;ans=min(ans1,ans);}
}
}
}
base1++;
}
if(base2<top2){
for(int i=0;i<7;i++)
{
if(i<4){
copy1(n1,q2[base2]);
if(n1.mat[i]==9) n1.mat[i]=1;
else n1.mat[i]+=1;
if(check2(n1)){
copy1(q2[top2],n1);
q2[top2].sum=q2[base2].sum+1;
top2++;
int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
vis2[num]=top2-1;
if(vis1[num]) {ans1=q2[top2-1].sum+q1[vis1[num]].sum;ans=min(ans,ans1);}
}
copy1(n1,q2[base2]);
if(n1.mat[i]==1) n1.mat[i]=9;
else n1.mat[i]-=1;
if(check2(n1)){
copy1(q2[top2],n1);
q2[top2].sum=q2[base2].sum+1;
top2++;
int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
vis2[num]=top2-1;
if(vis1[num]) {ans1=q2[top2-1].sum+q1[vis1[num]].sum;ans=min(ans,ans1);}
}
}
else
{
int k=i-4;
copy1(n1,q2[base2]);
int d=n1.mat[k];n1.mat[k]=n1.mat[k+1],n1.mat[k+1]=d;
if(check2(n1)){
copy1(q2[top2],n1);
q2[top2].sum=q2[base2].sum+1;
top2++;
int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3];
vis2[num]=top2-1;
if(vis1[num]) {ans1=q2[top2-1].sum+q1[vis1[num]].sum;ans=min(ans1,ans);}
}
}
}
base2++;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
ans=0x3ffffff;
char str1[5],str2[5];
node q11,q22;
scanf("%s",str1);scanf("%s",str2);
for(int i=0;i<4;i++)
{
q11.mat[i]=str1[i]-'0';
q22.mat[i]=str2[i]-'0';
}
top1=top2=base1=base2=1;
memset(q1,0,sizeof(q1));
memset(q2,0,sizeof(q2));
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
copy1(q1[1],q11);
copy1(q2[1],q22);
top1++;top2++;
BFS();
printf("%d\n",ans);
char nnn[10];
gets(nnn);
}
return 0;
}