Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 70246 | Accepted: 22095 |
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
把每个状态搜一遍
记得特判
ACcode:
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define maxn 100100
using namespace std;
int n,k;
struct Node{
int x;
int t;
};
bool vis[maxn];
Node my,now,s1,s2,s3;
bool judge(Node x){
if(x.x<0||x.x>100000||vis[x.x])return false;
return true;
}
void bfs(){
if(n>=k){
printf("%d\n",n-k);
return;
}
queue<Node>q;
memset(vis,0,sizeof(vis));
my.x=n;
my.t=0;
q.push(my);
vis[n]=1;
while(!q.empty()){
now=q.front();q.pop();
s1=now;s1.t++;s1.x+=1;
if(judge(s1)){
if(s1.x==k){
printf("%d\n",s1.t);
return;
}else {
vis[s1.x]=1;
q.push(s1);
}
}
s2=now;s2.t++;s2.x-=1;
if(judge(s2)){
if(s2.x==k){
printf("%d\n",s2.t);
return;
}else {
vis[s2.x]=1;
q.push(s2);
}
}
s3=now;s3.t++;s3.x*=2;
if(judge(s3)){
if(s3.x==k){
printf("%d\n",s3.t);
return;
}else {
vis[s3.x]=1;
q.push(s3);
}
}
}
}
int main(){
while(~scanf("%d%d",&n,&k))bfs();
return 0;
}