///使用DFS+回溯法,当然也可以用BFS,但是那样的话可能要把每个状态下的map都要和位置 ///坐标一样入栈,占用的空间肯定要大于使用DFS不少。改天用下BFS试试。 ///题目倒不难,关键还是读懂题意,并且构思好程序的流程同时还要注意下程序中的细节, ///当程序运行达不到预期结果时,要快速找到程序的出错点。 ///程序可能有点乱,主要是dfs中的那几个分支也就是方向的代码有点类似,占用了很大篇幅 #include<stdio.h> #include<string.h> int w,h; int map[25][25]; int dr[2]={1,-1}; int num; int dfs(int a,int b,int c,int d,int k) { int i,j,t; if(k>10) return 0; if(a==c&&b==d) { if(k<num) { num=k; return 0; } } if(b-1>=0&&map[a][b-1]!=1) { for(i=b-1,t=0;i>=0;i--) { if(map[a][i]==1) break; else if(map[a][i]==3) { if(k+1<num) { num=k+1; return 0; } else return 0; } else t++; } if(t!=b) { b=b-t; map[a][i]=0; dfs(a,b,c,d,k+1); map[a][i]=1; b=b+t; } } if(b+1<w&&map[a][b+1]!=1) { for(i=b+1,t=0;i<w;i++) { if(map[a][i]==1) break; else if(map[a][i]==3) { if(k+1<num) { num=k+1; return 0; } else return 0; } else t++; } if(t!=w-b-1) { b=b+t; map[a][i]=0; dfs(a,b,c,d,k+1); map[a][i]=1; b=b-t; } } if(a+1<h&&map[a+1][b]!=1) { for(i=a+1,t=0;i<h;i++) { if(map[i][b]==1) break; else if(map[i][b]==3) { if(k+1<num) { num=k+1; return 0; } else return 0; } else t++; } if(t!=h-a-1) { a=a+t; map[i][b]=0; dfs(a,b,c,d,k+1); map[i][b]=1; a=a-t; } } if(a-1>=0&&map[a-1][b]!=1) { for(i=a-1,t=0;i>=0;i--) { if(map[i][b]==1) break; else if(map[i][b]==3) { if(k+1<num) { num=k+1; return 0; } else return 0; } else t++; } if(t!=a) { a=a-t; map[i][b]=0; dfs(a,b,c,d,k+1); map[i][b]=1; a=a+t; } } return 0; } int main() { /*freopen("in4.txt","r",stdin); freopen("out.txt","w",stdout);*/ while(scanf("%d%d",&w,&h)==2&&w&&h) { int i,j,s1,s2,g1,g2; num=11; for(i=0;i<h;i++) { for(j=0;j<w;j++) { scanf("%d",&map[i][j]); if(map[i][j]==2) { s1=i;s2=j; } if(map[i][j]==3) { g1=i;g2=j; } } } dfs(s1,s2,g1,g2,0); if(num>10) printf("-1/n"); else printf("%d/n",num); } }