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
题目大意:有一头牛,给出位置不会移动,有一个人要去抓这头牛,人的初始坐标给了,他可以向前走一步,也可以向后走一步,还可以直接跳到当前坐标的二倍处,所花的时间都是1;输出他抓到牛所用的最短时间。宽搜。
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=15204
源代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
queue<int> p;
int step[100005];
int vis[100005];
int n,m;
bool let(int u)
{
if(u<0||u>100000||vis[u])
return 0;
return 1;
}
int bfs()
{
p.push(n);
while(!p.empty())
{
int u;
u=p.front();
p.pop();
if(u==m)
{
printf("%d\n",step[u]);
return 0;
}
if(let(u+1))
{
step[u+1]=step[u]+1;
vis[u+1]=1;
p.push(u+1);
}
if(let(u-1))
{
step[u-1]=step[u]+1;
vis[u-1]=1;
p.push(u-1);
}
if(let(u*2))
{
step[2*u]=step[u]+1;
vis[2*u]=1;
p.push(2*u);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
bfs();
return 0;
}