Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a pointN (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 orX + 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?
5 17
4
The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.
题意:在x坐标上,农夫在n,牛在k。农夫每次可以移动到n-1, n+1, n*2的点。求最少到达k的步数。
用广搜,先搜到的肯定式最短步数。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 100005
int book[N];
struct node{
int x;
int stemp;
}u,e;
int k,n;
int text(node a){
if(a.x<0 || a.x>=N || book[a.x]==1)
return 0;
return 1;
}
void BFS(){
u.x=n;
u.stemp=0;
book[u.x]=1;
queue<node>q;
while(!q.empty()) q.pop();
q.push(u);
while(!q.empty()){
u=q.front();
q.pop();
if(u.x==k){//找到了
printf("%d\n",u.stemp);
break;
}
e.x=u.x+1;//三个方向
if(text(e)==1){
e.stemp=u.stemp+1;
book[e.x]=1;
q.push(e);
}
e.x=u.x-1;//三个方向
if(text(e)==1){
e.stemp=u.stemp+1;
book[e.x]=1;
q.push(e);
}
e.x=u.x*2;//三个方向
if(text(e)==1){
e.stemp=u.stemp+1;
book[e.x]=1;
q.push(e);
}
}
}
int main(){
while(scanf("%d%d",&n,&k)!=EOF){
memset(book,0,sizeof(book));
BFS();
}
}