POJ 3009 Curling 2.0冰壶游戏(dfs)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3009 Curling 2.0冰壶游戏(dfs)相关的知识,希望对你有一定的参考价值。
条件:要移动的方向旁边有障碍物时不能动
来自 http://blog.sina.com.cn/s/blog_7865b08301013fku.html 的代码,感叹下自己代码的渣渣
1 int map[MAX][MAX] ; 2 int h, w , min = INT_MAX ; 3 int sx , sy , ex, ey ; 4 int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; 5 void init(){ 6 for(int i = 0 ;i < h ; i++) 7 for(int j = 0 ; j < w ; j++){ 8 scanf("%d",&map[i][j]) ; 9 if(map[i][j] == 2){ 10 map[i][j] = 0 ; 11 sx = i ; 12 sy = j ; 13 } 14 15 if(map[i][j] == 3){ 16 ex = i ; 17 ey = j ; 18 } 19 } 20 min = INT_MAX ;//!因为有多组数据所以每一次都要刷新min的初始值INT_MAX 21 } 22 23 int ok(int x , int y){//判断是否越界的函数 24 if(x >=0 && x < h && y >=0 && y < w) return 1 ; 25 return 0 ; 26 } 27 28 void dfs(int step , int x , int y){ 29 if(step >=10) return ; //如果超过10步,果断离开 30 for(int i = 0 ; i < 4; i++){ 31 int k =x+d[i][0] , v = y+d[i][1] ; 32 33 if(map[k][v] == 1) continue ; 34 35 while(!map[k][v]){ 36 k += d[i][0] ; 37 v += d[i][1] ; 38 } 39 if(ok(k,v)){ //如果没有跑出界外 40 if(map[k][v] == 1){//如果此时在障碍物上面 41 map[k][v] = 0 ;//击碎障碍物 42 dfs(step+1 , k-d[i][0] , v-d[i][1]) ;//后退一步继续搜索!‘-’重要! 43 map[k][v] = 1 ;//回溯要复原原来的场景 44 } 45 if(map[k][v] == 3){ 46 if(step+1 < min) min = step + 1; 47 } 48 } 49 } 50 } 51 int main(){ 52 while(scanf("%d %d",&w,&h),h&&w){ 53 init() ; 54 dfs(0,sx,sy) ; 55 if(min < INT_MAX) 56 printf("%d\n",min) ; 57 else 58 printf("-1\n") ; 59 } 60 return 0 ; 61 }
自己的代码
1 int m,n; 2 int maps[25][25]; 3 int sx,sy,tx,ty,ans = INF; 4 int dx[] = {-1,0,0,1}; 5 int dy[] = {0,1,-1,0}; 6 struct Node{ 7 int maps[25][25]; 8 int x,y; 9 Node(){} 10 }; 11 bool ok(int x,int y,Node u){ 12 return (x>=0 && x<n && y >= 0 && y < m && u.maps[x][y] != 1); 13 } 14 void dfs(Node u,int step){ 15 16 if(step == 10 || step >= ans) return ; 17 18 for(int i = 0 ; i < 4 ; i ++){ 19 int newx = u.x + dx[i]; 20 int newy = u.y + dy[i]; 21 if(ok(newx,newy,u)){ 22 switch(i){ 23 case 0 : 24 for(int j = newx ; j >= 0 ; j --){ 25 if(u.maps[j][newy] == 3){ 26 if(ans > step){ 27 ans = step; 28 return ; 29 } 30 } 31 else if(u.maps[j][newy] == 1){ 32 Node tmp = u; 33 tmp.maps[j][newy] = 0; 34 tmp.x = j + 1; 35 dfs(tmp,step+1); 36 break; 37 } 38 } 39 break; 40 case 1 : 41 for(int j = newy ; j < m ; j ++){ 42 if(u.maps[newx][j] == 3){ 43 if(ans > step){ 44 ans = step; 45 return ; 46 } 47 } 48 else if(u.maps[newx][j] == 1){ 49 Node tmp = u; 50 tmp.maps[newx][j] = 0; 51 tmp.y = j - 1; 52 dfs(tmp,step+1); 53 break; 54 } 55 } 56 break; 57 case 2 : 58 for(int j = newy ; j >= 0 ; j --){ 59 if(u.maps[newx][j] == 3){ 60 if(ans > step){ 61 ans = step; 62 return ; 63 } 64 } 65 else if(u.maps[newx][j] == 1){ 66 Node tmp = u; 67 tmp.maps[newx][j] = 0; 68 tmp.y = j + 1 ; 69 dfs(tmp,step+1); 70 break; 71 } 72 } 73 break; 74 case 3 : 75 for(int j = newx ; j < n; j ++){ 76 if(u.maps[j][newy] == 3){ 77 if(ans > step){ 78 ans = step; 79 return ; 80 } 81 } 82 else if(u.maps[j][newy] == 1){ 83 Node tmp = u; 84 tmp.maps[j][newy] = 0; 85 tmp.x = j - 1; 86 //tmp.y = newy; 87 dfs(tmp,step+1); 88 break; 89 } 90 } 91 break; 92 } 93 } 94 } 95 } 96 int main(){ 97 while(scanf("%d%d",&m,&n) != EOF && (n || m)){ 98 memset(maps,0,sizeof(maps)); 99 Node start; 100 ans = INF; 101 for(int i = 0 ; i < n ; i ++){ 102 for(int j = 0 ; j < m ; j ++){ 103 scanf("%d",&maps[i][j]); 104 start.maps[i][j] = maps[i][j]; 105 if(maps[i][j] == 3){ 106 tx = i , ty = j; 107 }else if(maps[i][j] == 2){ 108 sx = i , sy = j; 109 start.x = sx; 110 start.y = sy; 111 } 112 } 113 } 114 int step = 0; 115 dfs(start,step); 116 if(ans == INF) printf("-1\n"); 117 else printf("%d\n",ans+1); 118 } 119 return 0; 120 }
以上是关于POJ 3009 Curling 2.0冰壶游戏(dfs)的主要内容,如果未能解决你的问题,请参考以下文章