ACM/ICPC 之 BFS-广搜+队列入门-抓牛(POJ3278)

这一题是练习广度优先搜索很好的例题,在很多广搜教学中经常用到,放在这里供学习搜索算法的孩纸们看看= =

 


 

 

题目大意:一维数轴上,农夫在N点,牛在K点,假定牛不会移动,农夫要找到这头牛只能够进行以下三种移动方法

  • 2*N-跳跃到两倍于自己所在的位置
  • N+1 -右移一位
  • N -1 -左移一位

 

BFS解法解析:按照移动步数依次遍历队首,pop掉,并拓展出下一步所有可走位置并依次压入队列(不懂的孩纸们找度娘,很基础的数据结构)中,在这里为Code方便,我使用STL中的queue。

 


 

 

Code如下:

 

 1 //从N到K
 2 //要么N*2,要么N+1或者N-1
 3 //Time: 94 Ms
 4 #include<iostream>
 5 #include<cstring>
 6 #include<cstdio>
 7 #include<queue>
 8 using namespace std;
 9 const int MAXN=100005;
10 int n,k;    //所在位置,需到达位置(一维)
11 int time[MAXN];
12 int v[MAXN];
13 void bfs()
14 {
15     int cur,temp;
16     queue<int> q;
17     q.push(n);
18     while( !q.empty() )
19     {
20         cur = q.front();
21         q.pop();
22         v[cur] = 1;
23         if(cur == k)
24         {
25             cout<<time[cur]<<endl;
26             return;
27         }
28     
29         for(int i=1;i<=3;i++)
30         {
31             if(i == 1)
32                 temp = cur+1;
33             else if(i == 2)
34                 temp = cur-1;
35             else if(i == 3)
36                 temp = cur*2;
37             //先判断temp的范围,以免v[]数组越界,ps: temp不能等于MAXN
38             if(temp>=0 && temp < MAXN && !v[temp])
39             {
40                 q.push(temp);
41                 time[temp] = time[cur]+1;
42                 v[temp] = 1;
43             }
44         }
45     }
46 }
47 int main()
48 {
49     cin>>n>>k;
50     if(n<=k)
51         bfs();
52     else
53         cout<<n-k<<endl;    //加上要快 30 MS - poj测试数据
54    return 0;
55 }

 

posted @ 2015-09-29 12:57  文字失效  阅读(428)  评论(0编辑  收藏  举报