#include<iostream> #include<queue> #include<cstring> using namespace std; int a[10][10]; int state_time[10][10]; int f[4][2]={0,1,0,-1,1,0,-1,0}; struct state { int x,y; int time; int count; }; int main() { int t,n,m; cin>>t; while(t--) { memset(state_time,-1,sizeof(state_time)); memset(a,0,sizeof(a)); cin>>n>>m; int sx,sy; int min=99909990; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>a[i][j]; if(a[i][j]==2) {sx=i;sy=j;} // if(a[i][j]==3) //{ lx=i;ly=j;} } state start; start.x=sx;start.y=sy;start.count=0;start.time=6; queue<state>q; q.push(start); while(!q.empty()) { state cur=q.front();q.pop(); if(state_time[cur.x][cur.y]>=cur.time)continue; //cout<<cur.x<<" "<<cur.y<<endl; if(state_time[cur.x][cur.y]<cur.time) {state_time[cur.x][cur.y]=cur.time;} if(cur.time==0)continue; if(a[cur.x][cur.y]==3) { if(cur.count<min)min=cur.count; continue; } if(a[cur.x][cur.y]==4) { cur.time=6; } for(int i=0;i<4;i++) { state zijiedian(cur); zijiedian.count++; zijiedian.time--; zijiedian.x+=f[i][0]; zijiedian.y+=f[i][1]; if(a[zijiedian.x][zijiedian.y]==0)continue; q.push(zijiedian); } } if(min==99909990)cout<<-1<<endl; else cout<<min<<endl; } return 0; }