#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[4][2] = {0,1,0,-1,-1,0,1,0};
int stepc[10][10];
int timec[10][10];
int map[10][10];
int m,n,flag;
void dfs(int x,int y,int step,int time)
{
if(x<0 || y<0 || x>=m || y>=n || step>=flag || time<=0 || map[x][y]==0)
return ;
if(map[x][y] == 3)
{
flag = min(flag,step);
return ;
}
if(map[x][y] == 4)time = 6;
if(stepc[x][y] <= step && timec[x][y] >= time)return ;
stepc[x][y] = step;
timec[x][y] = time;
for(int i = 0; i < 4; i++)
{
int dx = x + dp[i][0];
int dy = y + dp[i][1];
dfs(dx,dy,step+1,time-1);
}
}
int main()
{
int r,a,b;
scanf("%d",&r);
while(r--)
{
scanf("%d%d",&m,&n);
flag = 64;
for(int i =0 ; i< m; i++)
for(int j =0 ; j < n; j++)
{
scanf("%d",&map[i][j]);
timec[i][j] = 0;
stepc[i][j] = 64;
if(map[i][j] == 2)
{
a = i;
b = j;
}
}
dfs(a,b,0,6);
if(flag == 64)
printf("-1\n");
else
printf("%d\n",flag);
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[4][2] = {0,1,0,-1,-1,0,1,0};
int stepc[10][10];
int timec[10][10];
int map[10][10];
int m,n,flag;
void dfs(int x,int y,int step,int time)
{
if(x<0 || y<0 || x>=m || y>=n || step>=flag || time<=0 || map[x][y]==0)
return ;
if(map[x][y] == 3)
{
flag = min(flag,step);
return ;
}
if(map[x][y] == 4)time = 6;
if(stepc[x][y] <= step && timec[x][y] >= time)return ;
stepc[x][y] = step;
timec[x][y] = time;
for(int i = 0; i < 4; i++)
{
int dx = x + dp[i][0];
int dy = y + dp[i][1];
dfs(dx,dy,step+1,time-1);
}
}
int main()
{
int r,a,b;
scanf("%d",&r);
while(r--)
{
scanf("%d%d",&m,&n);
flag = 64;
for(int i =0 ; i< m; i++)
for(int j =0 ; j < n; j++)
{
scanf("%d",&map[i][j]);
timec[i][j] = 0;
stepc[i][j] = 64;
if(map[i][j] == 2)
{
a = i;
b = j;
}
}
dfs(a,b,0,6);
if(flag == 64)
printf("-1\n");
else
printf("%d\n",flag);
}
return 0;
}