knightship
#include<iostream> #include<cstdio> using namespace std; int t,MAXD,sx,sy; int a[6][6]; int dx[9]={0,-1,-2,1,-2,2,-1,2,1}; int dy[9]={0,-2,-1,-2,1,-1,2,1,2}; inline void read() { char c; for(int i=1;i<=5;i++) { while((c<'0'||c>'9')&&c!='*') c=getchar(); for(int j=1;j<=5;j++) { if(c=='*') { sx = i; sy = j; a[i][j]=2; c=getchar(); continue; } a[i][j]=c-'0'; c=getchar(); } } } int aim[6][6]={{0,0,0,0,0,0},{1,1,1,1,1,1},{0,0,1,1,1,1},{0,0,0,2,1,1},{0,0,0,0,0,1},{0,0,0,0,0,0}}; inline int close() //valuation function { int Ans=0; for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) Ans+=aim[i][j]^a[i][j]; return Ans>>1; } inline bool dfs(int t,int x,int y,int pre) { if(t>15) return 0; int f=close(); if(f==0) { printf("%d\n",t); return 1; } if(t+f>MAXD) return 0; for(int i=1;i<=8;i++) if(i+pre!=9) { int xx=x+dx[i],yy=y+dy[i]; if(1<=xx&&xx<=5&&1<=yy&&yy<=5) { a[x][y] = a[xx][yy]; a[xx][yy]=2; if(dfs(t+1,xx,yy,i)) return 1; a[xx][yy] = a[x][y]; a[x][y] = 2 ; } } return 0; } intmain () { scanf("%d",&t); while(t--) { read(); bool f= 0 ; for (MAXD= 1 ;MAXD<= 16 ;MAXD++ ) //Iteratively deepen if (dfs( 0 ,sx,sy, 0 )){ f=1; break; } if(!f) puts("-1"); } return 0; }