题意:农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
思路:简单bfs即可。可以自己手动写队列,也可以用stl,注意结构体的初始化操作写法。
手动队列:
#include <stdio.h>
#include <string.h>
#define N 100005
int q[N],flag[N];
int n,m,now;
int rear,front;
int test(int x){
if(x<0 || x>100000 ||flag[x])
return 0;
return 1;
}
void enter(int x){
q[++rear] = x;
flag[x] = flag[now]+1;
}
int main(){
//freopen("a.txt","r",stdin);
while(scanf("%d %d ",&n,&m)!=EOF){
memset(flag,0,sizeof(flag));
rear = front = -1;
q[++rear] = n;
flag[n] = 1;
while(front < rear){
now = q[++front];
if(now == m){
printf("%d\n",flag[now]-1);
break;
}
if(test(now+1))
enter(now+1);
if(test(now-1))
enter(now-1);
if(test(now*2))
enter(now*2);
}
}
return 0;
}
stl的queue:
#include <cstdio>
#include <string>
#include <queue>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define INF 0x3fffffff
using namespace std;
#define N 100000
int used[N+5];
struct node{
int step,id;
node(int ll,int ii):step(ll),id(ii){};
};
queue<node> q;
int n,m;
int main(){
struct node p(0,0);
memset(used,0,sizeof(used));
scanf("%d %d",&n,&m);
q.push(node(0,n));
used[n] = 1;
while(!q.empty()){
p = q.front();
if(p.id == m){
printf("%d\n",p.step);
break;
}
if(p.id>0 && !used[p.id-1]){
q.push(node(p.step+1,p.id-1));
used[p.id-1] = 1;
}
if(p.id<N && !used[p.id+1]){
q.push(node(p.step+1,p.id+1));
used[p.id+1] = 1;
}
if(p.id*2<=N && !used[p.id*2]){
q.push(node(p.step+1,p.id*2));
used[p.id*2] = 1;
}
q.pop();
}
return 0;
}