双端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 ",ans); char nnn[10]; gets(nnn); } return 0; }