码迷,mamicode.com
首页 > 其他好文 > 详细

简单深搜(poj 3009)

时间:2018-03-19 19:05:32      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:style   ++   amp   ret   body   problem   pre   自己   返回   

题目链接: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)

标签:style   ++   amp   ret   body   problem   pre   自己   返回   

原文地址:https://www.cnblogs.com/ZQUACM-875180305/p/8603749.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!