Problem 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
Line 1: Two space-separated integers: N and K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
5 17
Sample Output
4
题意:
求X轴上n->k的最短步骤,(n->n-1,n->n+1,n->2*n)
解题思路:
BFS
代码:
#include<bits/stdc++.h>
using namespace std;
struct state{
int x,step;
};
int vis[200001];
int bfs(int n,int k){
memset(vis,0,sizeof(vis));
state str,now,next;
str.x=n,str.step=0;
vis[n]=1;
int tp;
queue<state>q;
q.push(str);
while(!q.empty()){
now=q.front(),q.pop();
if(now.x==k)return now.step;
for(int i=0;i<3;++i){
if(i==0) tp=now.x-1;
else if(i==1) tp=now.x+1;
else tp=(now.x<<1);
if(vis[tp]||tp<0||tp>100000) continue;
vis[tp]=1;
next.x=tp;
next.step=now.step+1;
q.push(next);
}
}
return -1;
}
int main(){
int n,k;
while(~scanf("%d%d",&n,&k)){
if(n>=k)printf("%d\n",n-k);
else printf("%d\n",bfs(n,k));
}
return 0;
}