POJ3009 Curling 2.0

正式做POJ的第一题,做出来后又看了别人的代码,就又完善了一下,也通过了。参考 http://blog.sina.com.cn/s/blog_4abcd9bc0100phzb.html

改了之后觉得写得比他好,呵呵。

 1 #include <iostream>
 2 #include <stdlib.h>
 3 
 4 using namespace std;
 5 
 6 #define MAX_W 20
 7 #define MAX_H 20
 8 
 9 int s_x;
10 int s_y;
11 int w;
12 int h;
13 char board[MAX_H+2][MAX_W+2];    //留边,省得越界检查
14 int res;
15 
16 int dx[]={0,0,1,-1};
17 int dy[]={1,-1,0,0};
18 
19 void read(void);
20 void dfs(int x,int y,int time);
21 
22 
23 int main(void)
24 {
25     while(scanf("%d%d",&w,&h),w)
26     {
27         res=20;
28         getchar();    //残留的换行符
29         read();
30         dfs(s_x,s_y,0);
31         printf("%d\n",res==20?-1:res);
32     }
33     return 0;
34 }
35 
36 void read(void)
37 {
38     int i,j;
39     for(i=0;i<=h+1;i++)
40     {
41         for(j=0;j<=w+1;j++)
42         {
43             if(i==0 || j==0 || i==h+1 || j==w+1)
44             {
45                 board[i][j]=0; //清边,防止影响下一轮判断
46                 continue;
47             }
48 
49             board[i][j]=getchar();
50             getchar();
51             if(board[i][j]=='2')
52             {
53                 s_x=i;
54                 s_y=j;
55             }
56         }
57     }
58 }
59 
60 
61 //从该点寻找终点
62 //time是已经扔石头的次数
63 void dfs(int x,int y,int time)
64 {
65     int i;
66 
67     if(time>=10) return;
68 
69     for(i=0;i<4;i++)
70     {
71         int nx=x;
72         int ny=y;
73         if(board[x+dx[i]][y+dy[i]]=='1')    //方块阻挡则换方向
74             continue;
75 
76         while(1)    //在该方向滑行
77         {
78             nx+=dx[i],ny+=dy[i];
79             if(nx<=0 || ny<=0 ||nx>h || ny>w)    //滑出,换下一方向
80                 break;
81             else if(board[nx][ny]=='1')
82             {
83                 //停下,消失方块,完成该方向,恢复方块,进行下一方向
84                 board[nx][ny]='0';
85                 dfs(nx-dx[i],ny-dy[i],time+1);
86                 board[nx][ny]='1';
87                 break;
88             }
89             else if(board[nx][ny]=='3')    //成功,不用尝试其他方向
90             {                            //因为其它方向一定步骤更多
91                 res=__min(res,time+1);
92                 return;
93             }
94 
95         }
96     }
97 }
Curling.cpp

 

posted @ 2013-08-09 15:16  ZackCoder  阅读(159)  评论(0编辑  收藏  举报