poj 3009 Curling 2.0( dfs )

题目:http://poj.org/problem?id=3009

参考博客:http://www.cnblogs.com/LK1994/

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<stack>
 6 #include<queue>
 7 #include<iomanip>
 8 #include<cmath>
 9 #include<map>
10 #include<vector>
11 #include<algorithm>
12 using namespace std;
13 
14 int w,h,G[30][30];
15 int d[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
16 int minstep;
17 
18 int dfs(int sx,int sy,int step)
19 {
20     if(step>10)
21     return step;
22     for(int i=0; i<4; i++)
23     for(int k=1; k<20; k++)
24     {
25         int tx=sx+d[i][0]*k;
26         int ty=sy+d[i][1]*k;
27         if(tx>=1&&tx<=h&&ty>=1&&ty<=w)
28         {
29             if(G[tx][ty]==3) return step+1;
30             else if(G[tx][ty]==1)
31             {
32                 if(k==1) break;
33                 int x=sx+d[i][0]*(k-1);
34                 int y=sy+d[i][1]*(k-1);
35                 G[tx][ty]=0;
36                 minstep=min(minstep,dfs(x,y,step+1));
37                 G[tx][ty]=1;
38                 break;
39             }
40         }
41         else break;
42     }
43     return minstep;
44 }
45 int main()
46 {
47     int sx,sy,ans;
48     while(cin>>w>>h&&(w!=0||h!=0))
49     {
50         for(int i=1; i<=h; i++)
51         for(int j=1; j<=w; j++)
52         {
53             cin>>G[i][j];
54             if(G[i][j]==2)
55             {
56                 sx=i; sy=j;
57                 G[i][j]=0;
58             }
59         }
60         minstep=11;
61         ans=dfs(sx,sy,0);
62         if(ans>10) ans=-1;
63         cout<<ans<<endl;
64     }
65     return 0;
66 }

 

posted @ 2013-08-27 22:02  水门  阅读(169)  评论(0编辑  收藏  举报