简单深搜(poj 3009)

Posted flyer_duck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单深搜(poj 3009)相关的知识,希望对你有一定的参考价值。

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

题目:冰壶撞向目的地,只有遇到“1”才能停下来,并且把“1”撞成“0”。只能横冲直撞,不允许蛇皮走位等等骚操作。从“2”要撞到“3”,周围有“0”,才能向有“0”的地方滑。运动员只能推十次,问最少要多少次才到“3”?

用深搜遍历每一个方向。

 1 #include<stdio.h>
 2 #include<string.h>
 3 int n,m,ans,ans1; ///ans为答案,ans1为中间值
 4 int mp[26][26],dx[]={0,-1,1,0},dy[]={-1,0,0,1};///存好方向 
 5 
 6 void dfs(int x,int y)
 7 {
 8     int gx,gy;
 9     if(ans1>=ans||ans1>10) return ; ///此处进行枝剪
10     
11     for(int i=0;i<4;i++){ ///四个方向
12         gx=x+dx[i],gy=y+dy[i];
13         
14         if(0<=gx&&n>gx&&0<=gy&&m>gy){ 
15             if(mp[gy][gx]!=1){ ///不越界,且要走的方向第一个不为 “1”
16                 for(;;){
17                     if(gy<0||gy>=m||gx<0||gx>=n) ///越界
18                         break ; 
19                         
20                     if(mp[gy][gx]==1){
21                         mp[gy][gx]=0;
22                         ans1++;
23                         dfs(gx-dx[i],gy-dy[i]);
24                         ans1--;
25                         mp[gy][gx]=1;
26                         break ;
27                     }
28                     
29                     if(mp[gy][gx]==3){ ///找到“3”即可返回
30                         if(ans>ans1)
31                             ans=ans1;
32                         return ;
33                     }
34 
35                     gy=gy+dy[i];
36                     gx=gx+dx[i];
37                 }
38             }
39         }
40     }
41     return ;
42 }
43 
44 int main()
45 {
46     while( ~scanf("%d%d",&n,&m)){
47         if(n==0&&m==0) break;
48         int nx,ny;
49         for(int i=0;i<m;i++){
50             for(int j=0;j<n;j++){
51                 scanf("%d",&mp[i][j]);
52                 if(mp[i][j]==2) ///找出起点的坐标
53                     nx=j,ny=i;
54             }
55         }
56         mp[ny][nx]=0;
57         
58         ans=1e7,ans1=1;
59         dfs(nx,ny);
60         if(ans>10)
61             printf("-1\n");
62         else
63             printf("%d\n",ans);
64     }
65     
66     return 0;
67 }

结论:遇到图,不要被问题吓到,无论如何都要动手自己做一遍。

以上是关于简单深搜(poj 3009)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1321 深搜dfs

源哥每日一题第十五弹 poj 1190 关于深搜减枝以及对于阅读代码的思考

深搜+剪枝--poj2676--数独

POJ 2386 Lake Counting DFS

POJ1011 (深搜+剪枝)

POJ 2531 暴力深搜