Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 77295 | Accepted: 24435 |
Description
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?
Input
Output
Sample Input
5 17
Sample Output
4
Hint
Source
简单搜索。。wa了三次。。。居然是全局变量和局部变量撞在一起的原因。。。可恶。。这个错误我已经犯了很多次了。。
还有一个点是当x==1时只需要在x+1和2x中取其中一个更新,不然会重复记步
恩。。。。今天看了小岛君的回答。。感动人心啊。。。敬佩
没了,下面代码:
/*
━━━━━┒
┓┏┓┏┓┃μ'sic foever!!
┛┗┛┗┛┃\○/
┓┏┓┏┓┃ /
┛┗┛┗┛┃ノ)
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┃┃┃┃┃┃
┻┻┻┻┻┻
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
const int maxn=100010;
const int INF=8000000;
int d[maxn];
int n,k;
int move[2]={1,-1};
int bfs(){
queue<int> que;
int i,j;
for(i=0;i<maxn;i++){
d[i]=INF;
}
que.push(n);
d[n]=0;
while(que.size()){
int t=que.front();
que.pop();
//cout<<t<<" "<<d[t]<<endl;
if(t==k){
break;
}
int nx;
for(i=0;i<2;i++){
nx=t+move[i];
if(nx>=0&&nx<=100000&&d[nx]==INF){
que.push(nx);
d[nx]=d[t]+1;
}
}
if(t!=1){
nx=2*t;
if(nx>=0&&nx<=100000&&d[nx]==INF){
que.push(nx);
d[nx]=d[t]+1;
}
}
}
return d[k];
}
int main(){
while(~scanf("%d%d",&n,&k)){
int result=bfs();
cout<<result<<endl;
}
return 0;
}