#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<cmath>
#include<queue>
using namespace std;
int jz[20][20]={0};//存储原地图
struct NODE//一个节点,即一个状态
{
int x,y,bs,xl;//位置,步数与血量
}qc,fr;
int zl[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//增量,即向四周可能走的位置
int visit[20][20]={0};//visit int版数组
queue<NODE>wz;//bfs队列
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int sx,sy;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&jz[i][j]);
if(jz[i][j]==2)sx=i,sy=j;//记录出发位置
}
wz.push((NODE){sx,sy,0,6});//推入队列,这里用了强制类型转换
visit[sx][sy]=6;//初始位置设置其visit值
bool tf=true;//判断是否完成任务,tf==false即完成
while(!wz.empty()&&tf)//直到完全失败或成功
{
qc=wz.front();//取队列最前面的节点
wz.pop();//弹出队列
if(qc.xl==1)continue;//如果血量为1,则继续
for(int i=0;i<4&&tf;i++)//四个方向
{
if(jz[qc.x+zl[i][0]][qc.y+zl[i][1]])//如果可以到达
if(visit[qc.x+zl[i][0]][qc.y+zl[i][1]]<qc.xl-1)//如果血量更大
{
fr.x=qc.x+zl[i][0];
fr.y=qc.y+zl[i][1];
fr.bs=qc.bs+1;//更新新的节点
fr.xl=jz[fr.x][fr.y]==4?6:qc.xl-1;//如果下一个节点是有鼠标的,那么有变成6
visit[fr.x][fr.y]=qc.xl-1;//更新visit
if(jz[fr.x][fr.y]==3)tf=false;//如果任务完成,那么tf更新
wz.push(fr);//加入队列
}
}
}
if(tf)printf("-1");//如果任务失败
else printf("%d",fr.bs);//如果任务成功,则输出结果
return 0;
}
/**************************************************************
Problem: 1914
User: admin
Language: C++
Result: Accepted
Time:24 ms
Memory:2080 kb
****************************************************************/