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
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.
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <stack> using namespace std; struct point { int x,step; } st; queue <point> q;//结构体队列 int vis[200000];//标记数组,判断这个点是否走过。 int n, m; int flat; int bfs() { while (!q.empty())//每一次都将队列里面的数清空 { q.pop(); //将队列里的数清空 } memset(vis, 0, sizeof(vis)); //vis数组中的数都赋值为0 vis[st.x]=1;//牧场主开始的位置标记,代表不会走回来 q.push(st);//在队列尾部添加起点数据 while (!q.empty())//当队列中还有数存在是时候,一直循环 { point now = q.front();//定义一个结构体now==队列的头部数据 if(now.x==m) //说明牧场主走到了牛的位置 return now.step;//当一开始,牧场主和牛的位置一样的时候,就直接返回。这个不要忘记 q.pop(); //删除队列头部数据 for (int j=0; j<3; j++) //三种情况的循环 { point next=now; if (j==0) { next.x=next.x+1; } else if (j==1) { next.x=next.x-1; } else if (j==2) { next.x=next.x*2; } ++next.step; if (next.x==m) { return next.step; } if (next.x>=0 && next.x<=200000 && !vis[next.x])//判断是否越界 { vis[next.x]=1;//牧场主next的位置标记,代表不会走回来 q.push(next); //如果next的位置没有被走过且没有越界就入队 } } } return 0; } int main() { while (~scanf("%d %d", &n, &m)) { st.x = n; st.step=0; printf("%d ", bfs()); } return 0; }