return true;
pvis[pnow.x][pnow.y]=true;
p.push(pnow);
while(!p.empty())
{
pnow=p.front();
p.pop();
for(int i=0;i<4;i++)
{
ptmp=pnow;
ptmp.x+=dx[i];
ptmp.y+=dy[i];
if(p_ok())
{
if(ptmp.x==now.x-dx[k]&&ptmp.y==now.y-dy[k])
return true;
pvis[ptmp.x][ptmp.y]=true;
p.push(ptmp);
}
}
}
return false;
}
bool ok()
{
if(tmp.x>=0&&tmp.y>=0&&tmp.x
else
return false;
}
int bfs()
{
while(!q.empty())
q.pop();
now.cnt=0;
vis[now.x][now.y][now.px][now.py]=true;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<4;i++)
tmp=now;
tmp.x+=dx[i];
tmp.y+=dy[i];
if(ok())
{
if(p_bfs(i))//判断人能否走到要推箱子的位置
{
tmp.cnt++;
if(maze[tmp.x][tmp.y]==3)
return tmp.cnt;
tmp.px=now.x;tmp.py=now.y;
vis[tmp.x][tmp.y][now.px][now.py]=true;
q.push(tmp);
}
}
}
}
return -1;
}
int main()
{
int t;
while(scanf("%d",&t)==1)
{
while(t--)
{
memset(vis,false,sizeof(vis));
scanf("%d %d",&m,&n);
for(int i=0;i
for(int j=0;j
scanf("%d",&maze[i][j]);
if(maze[i][j]==2){now.x=i;now.y=j;}
else if(maze[i][j]==4){now.px=i;now.py=j;}//初始化BFS箱子的第一个节点
}
}
printf("%d\n",bfs());
}
}
return 0;
}