https://vjudge.net/contest/65959#problem/C
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
在0到100000这个闭区间长度内有一个人和一只牛,人有3种操作,一种是向左走一步,第二种是向右走一步,第三种是瞬移到当前位置的两倍,即从x瞬移到2*x,每种操作花费一分钟,问这个人最少需要多少时间到达牛的位置。
思路:
很简单,模拟人的3种操作进行bfs就可以了。
- #include<iostream>
- #include<queue>
- #include<cstring>
- #include<cstdio>
- using namespace std;
- const int maxn=100001;
- bool vis[maxn];//标记数组
- int step[maxn];//记录到了每一位置所走的步数
- queue <int> q;//定义队列
- int bfs(int n,int k)
- {
- int head,next;
- q.push(n); //开始FJ在n位置,n入队
- step[n]=0;
- vis[n]=true; //标记已访问
- while(!q.empty()) //当队列非空
- {
- head=q.front(); //取队首
- q.pop(); //弹出对首
- for(int i=0;i<3;i++) //FJ的三种走法
- {
- if(i==0) next=head-1;
- else if(i==1) next=head+1;
- else next=head*2;
- if(next<0 || next>=maxn) continue; //排除出界情况
- if(!vis[next]) //如果next位置未被访问
- {
- q.push(next); //入队
- step[next]=step[head]+1; //步数+1
- vis[next]=true; //标记已访问
- }
- if(next==k) return step[next]; //当遍历到结果,返回步数
- }
- }
- }
- int main()
- {
- int n,k;
- while(cin>>n>>k)
- {
- memset(step,0,sizeof(step));
- memset(vis,false,sizeof(vis));
- while(!q.empty()) q.pop(); //注意调用前要先清空
- if(n>=k) printf("%d\n",n-k);
- else printf("%d\n",bfs(n,k));
- }
- return 0;
- }