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 }
他坐在湖边,望向天空,她坐在对岸,盯着湖面