Curling 2.0
http://poj.org/problem?id=3009
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<cstdlib> 5 #include<algorithm> 6 #define MAXN 101 7 using namespace std; 8 9 int a[MAXN][MAXN]; 10 int move[][2]= {{1,0},{-1,0},{0,1},{0,-1}}; 11 int n,m,sx,sy,ex,ey,ans; 12 13 void dfs(int x,int y,int k) 14 { 15 int xx,yy; 16 if(k>=10||k>=ans) return; 17 for(int i=0; i<4; i++) 18 { 19 xx=x+move[i][0]; 20 yy=y+move[i][1]; 21 if(a[xx][yy]==1) continue; 22 while(1) 23 { 24 if(xx>=0&&xx<m&&yy>=0&&yy<n) 25 { 26 if(a[xx][yy]==1) 27 { 28 a[xx][yy]=0; 29 dfs(xx-move[i][0],yy-move[i][1],k+1); 30 a[xx][yy]=1; 31 break; 32 } 33 if(a[xx][yy]==3) 34 { 35 ans=min(ans,k+1); 36 break; 37 } 38 } 39 else if(!(xx>=0&&xx<m&&yy>=0&&yy<n)) break ; 40 xx=xx+move[i][0]; 41 yy=yy+move[i][1]; 42 } 43 } 44 return; 45 } 46 47 int main() 48 { 49 while(scanf("%d%d",&n,&m)&&n&&m) 50 { 51 ans=11; 52 for(int i=0; i<m; i++) 53 { 54 for(int j=0; j<n; j++) 55 { 56 scanf("%d",&a[i][j]); 57 if(a[i][j]==2) 58 { 59 sx=i; 60 sy=j; 61 } 62 } 63 } 64 dfs(sx,sy,0); 65 if(ans==11) printf("-1\n"); 66 else printf("%d\n",ans); 67 } 68 return 0; 69 }