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)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3009 Curling 2.0

Curling 2.0 POJ 3009(搜索)

poj3009 Curling 2.0

poj3009 Curling 2.0

poj 3009 Curling 2.0

POJ 3009 Curling 2.0