poj3278 Catch That Cow赶上那头牛
描述
农夫约翰已被告知逃亡母牛的位置,并希望立即抓住她。他开始于一个点Ñ(0≤ Ñ ≤100,000)上的数线和牛是在点ķ(0≤ ķ上相同数目的线≤100,000)。农夫约翰有两种交通方式:步行和传送。
*步行:FJ可以在一分钟内从任意点X移动到X -1或X + 1 点
*传送:FJ可以在一分钟内从任意点X移动到2× X点。
如果母牛不知道它的追求,根本不动,那么农夫约翰需要多长时间才能找回它?
输入
第1行:两个以空格分隔的整数:N和K.
产量
第1行:Farmer John捕获逃亡牛所需的最短时间(以分钟为单位)。
样本输入
5 17
样本输出
4
提示
农夫约翰到达逃亡牛的最快方法是沿着以下路径前进:5-10-9-18-17,需要4分钟。
代码思路:
//poj3278 Catch That Cow #include <iostream> #include <cstring> #include <queue> using namespace std; /* 思路: 一维数组上的广搜 广搜模板 队列起点入队 到终点广搜结束 bfs过程 广搜枚举走法 建图的过程 step记录步数 visited记录该点是否走过 */ int N,K; const int MAXN = 100000; int visited[MAXN+10]; // 判重标记,visited[i] = true 表示i 已经扩展过 struct Step{ int x; // 位置 int steps; // 到达x 所需的步数 Step(int xx,int s):x(xx),steps(s) { } }; queue<Step> q; // 队列, 即Open 表 int main() { cin >> N >> K; memset(visited,0,sizeof(visited)); q.push(Step(N,0)); visited[N] = 1; while(!q.empty()) { Step s = q.front(); if( s.x == K ) { // 找到目标 cout << s.steps <<endl; return 0; }else { if( s.x - 1 >= 0 && !visited[s.x-1] ) { q.push(Step(s.x-1,s.steps+1)); visited[s.x-1] = 1; } if( s.x + 1 <= MAXN && !visited[s.x+1] ) { q.push(Step(s.x+1,s.steps+1)); visited[s.x+1] = 1; } if( s.x * 2 <= MAXN &&!visited[s.x*2] ) { q.push(Step(s.x*2,s.steps+1)); visited[s.x*2] = 1; } q.pop(); } } return 0; }
超时代码:
#include<iostream> #include<cstring> using namespace std; /* 思路: 一维数组上的广搜 广搜模板 队列起点入队 到终点广搜结束 bfs过程 广搜枚举走法 建图的过程 step记录步数 visited记录该点是否走过 */ const int MAXN = 100000; int a[MAXN+10]; int n,k; int visited[MAXN+10]; int step[MAXN+10]; int main(){ cin>>n>>k; if(n>=k){ cout<<n-k<<endl; return 0; } memset(visited,0,sizeof(visited)); int head = 0,tail = 0; a[tail] = n; step[a[tail]] = 0; visited[a[tail]] = 1; tail++; while(head<tail){ int x = a[head]; if(x == k){ cout<<step[k]<<endl; return 0; } for(int i=1;i<=3;i++){ if(i==1){ if(!visited[x+1] && x+1<=MAXN){ int tx = x + 1; visited[x] = 1; a[tail++] = tx; step[tx] = step[x] + 1; } }else if(i==2){ if(!visited[2*x] && x*2 <= MAXN){ int tx = 2 * x; visited[tx] = 1; a[tail++] = tx; step[tx] = step[x] + 1; } }else{ if(!visited[x-1] && x-1 >=0){ int tx = x -1; visited[tx] = 1; a[tail++] = tx; step[tx] = step[x] + 1; } } } head++; } }