1 #include <cstdio>
2 #include <iostream>
3 #include <cstring>
4
5 using namespace std;
6
7 int w,h; //h:行 w:列
8 int sq[25][25];
9 int sx,sy,gx,gy; //起点终点
10 int dx[4]={1,-1,0,0};
11 int dy[4]={0,0,1,-1};
12 int result; //记录最后的结果
13
14 //在位置(x,y)上,已经走了ans步
15 void dfs(int x,int y,int ans){
16 if(x==gx&&y==gy){ //到达终点
17 if(result>ans){ //若有最小值
18 result = ans;
19 }
20 }
21 //若超过10步,或者超过当前最短步数
22 if(ans==10||ans>=result) return;
23 //往四个方向搜索
24 for(int i=0;i<4;i++){
25 int nx=x+dx[i], ny=y+dy[i];
26 //往某个方向一直走,直到出界或撞墙
27 while(1<=nx&&nx<=h&&1<=ny&&ny<=w&&sq[nx][ny]!=1){
28 if(nx==gx&&ny==gy){ //到达目标
29 ans++;
30 if(result>ans)
31 result = ans;
32 return;
33 }
34 nx+=dx[i]; ny+=dy[i];
35 }
36 if((nx==x+dx[i]&&ny==y+dy[i])||(nx<1||nx>h||ny<1||ny>w)){
37 continue; //此方向不能走,或出界
38 }
39 //撞墙
40 sq[nx][ny]=0;
41 ans++;
42 dfs(nx-dx[i],ny-dy[i],ans);
43 //回溯
44 sq[nx][ny]=1;
45 ans--;
46 }
47 }
48
49 void solve(){
50 result = 11;
51 dfs(sx,sy,0);
52 //只有在到达终点的时候才更新result,
53 //result==11说明不能到达
54 if(result==11)
55 printf("-1\n");
56 else
57 printf("%d\n",result);
58 }
59
60 int main(){
61 while(1){
62 scanf("%d%d",&w,&h);
63 if(w==0&&h==0) break;
64 for(int i=1;i<=h;i++){
65 for(int j=1;j<=w;j++){
66 scanf("%d",&sq[i][j]);
67 if(sq[i][j]==2){ sx=i; sy=j; }
68 if(sq[i][j]==3){ gx=i; gy=j; }
69 }
70 }
71 solve();
72 }
73 return 0;
74 }