poj3009
#include<iostream> using namespace std; int data[20][20]; int sx,sy; int m,n;//m行n列 int minstep; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; void dfs(int x, int y, int step) { if(step==11) return; if(step>=minstep) return; for(int i=0;i<4;i++) { int nx,ny; nx=x+dx[i]; ny=y+dy[i]; if(data[nx][ny]==1||nx<0||nx>=m||ny<0||ny>=n) continue; while(1) { if(data[nx][ny]==3) { if(step<minstep) minstep=step; return; } if(i==0&&nx==0) break; if(i==1&&ny==n-1) break; if(i==2&&nx==m-1) break; if(i==3&&ny==0) break; else if(data[nx+dx[i]][ny+dy[i]]==1) { data[nx+dx[i]][ny+dy[i]]=0; dfs(nx,ny,step+1); data[nx+dx[i]][ny+dy[i]]=1; break; } nx=nx+dx[i]; ny=ny+dy[i]; } } } int main() { //freopen("input.txt","r",stdin); while(cin>>n>>m) { if(n==0||m==0) break; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { cin>>data[i][j]; if(data[i][j]==2) { sx=i; sy=j; data[i][j]=0; } } } minstep=9999; dfs(sx,sy,1); if(minstep==9999) cout<<"-1"<<endl; else cout<<minstep<<endl; } return 0; }