#include
#include
using namespace std;
#define MAX 51
int step;
int minn=9999999;
int endx,endy;
int n,m;
bool book[MAX][MAX]={false}; //标记点
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //右,下,左,上
int map[MAX][MAX];
int min(int x,int y){
return(x<y?x:y);
}
void dfs(int x,int y,int step)
{
int dx,dy; *//走过的位置*
for(int i=0;i<4;i++)
{
dx=x+next[i][0]; *//*注意行变和列变*
dy=y+next[i][1];
if(dx==endx&&dy==endy) *//* 要两个同时才能到达终点*
{
minn=min(step+1,minn); *//比较所有走法中最小的*
return; *//*一种走完 回溯 寻找下一种
}*
if(dx<0||dx>n-1||dy<0||dy>m-1)
continue; *//继续执行for循环 即向右或向下或向左或向上*
if(book[dx][dy]==false&&map[dx][dy]==0)
{
book[dx][dy]=true;
dfs(dx,dy,step+1);
book[dx][dy]=false; *//回溯取消标记*
}
}
return;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]==2)
{
endx=i;
endy=j;
}
}
}
book[0][0]=true;
dfs(0,0,0);
cout<<minn<<endl;
return 0;
}