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 }