/* 限制步数 写迭代加深 注意剪枝:当先步数+不同的个数-1>当前限制的步数 就cut */ #include<cstdio> #include<cstring> #include<iostream> #define limit 15 using namespace std; int T,ans=20,falg; int xx[9]={0,-2,-2,-1,-1,1,1,2,2}; int yy[9]={0,-1,1,-2,2,2,-2,1,-1}; int s[10][7],get[10][10]; int target[10][10]; char si; void Get_target() { target[1][1]=1;target[1][2]=1;target[1][3]=1;target[1][4]=1;target[1][5]=1; target[2][1]=0;target[2][2]=1;target[2][3]=1;target[2][4]=1;target[2][5]=1; target[3][1]=0;target[3][2]=0;target[3][3]=2;target[3][4]=1;target[3][5]=1; target[4][1]=0;target[4][2]=0;target[4][3]=0;target[4][4]=0;target[4][5]=1; target[5][1]=0;target[5][2]=0;target[5][3]=0;target[5][4]=0;target[5][5]=0; } int Judge() { int ret=0; for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) if(s[i][j]!=target[i][j]) ret++; return ret; } void Dfs(int now,int x,int y,int sum) { if(falg)return; int c=Judge(); if(now==sum) { if(c==0) ans=sum,falg=1; return; } if(now-1+c>sum)return; for(int i=1;i<=8;i++) { int nx=x+xx[i]; int ny=y+yy[i]; if(nx>0&&nx<=5&&ny>0&&ny<=5) { swap(s[x][y],s[nx][ny]); Dfs(now+1,nx,ny,sum); swap(s[x][y],s[nx][ny]); } } } int main() { scanf("%d",&T); Get_target(); while(T--) { int x,y; for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) { cin>>si; if(si=='*')x=i,y=j,get[i][j]=2; else get[i][j]=si-'0'; } for(int k=0;k<=limit;k++) { falg=0;ans=20; for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) s[i][j]=get[i][j]; Dfs(0,x,y,k); if(ans==k)break; } if(ans<=15)printf("%d ",ans); else printf("-1 "); } return 0; }