Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 107515 | Accepted: 33598 |
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
题意:
一个农夫在n位置想追上一头在k位置的牛,每次可以选择3种移动方式
1:左移一格
2:右移一格
3:从x位置移动到x*2位置
现在让求最少的步数
比较简单的一个题
对这三种情况进行广搜即可。
每次对当前位置进行标记防止重复搜索(因为这个MLE了一次...
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
#define For(i,n) for(int i=0;i<n;i++)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
#define maxn 100005
#define move MOVE
typedef struct
{
int x,step; //每一个位置的步数和坐标x
} cow;
queue <cow> c;
bool Used[maxn]; //判断该坐标是否已经走过
int ans = INF;
int n,k;
bool Juge(int i)
{
return i>=0&&i<=100000&&!Used[i]; //判断位置是否合法
}
void bfs(int x,int step)
{
cow buf;
if(!c.empty())
c.pop();
if(k==x)
{
ans = min(ans,step); ///到达终点,取得最短步长ans
return;
}
buf.step = step+1;
if(Juge(x-1)&&!Used[x-1]) ///对三种方式遍历,如果下一步可以走,就压入C中
{
Used[x-1] = 1;
buf.x = x-1;
Used[buf.x] = 1;
c.push(buf);
}
if(Juge(x+1)&&!Used[x+1])
{
Used[x+1] = 1;
buf.x = x+1;
c.push(buf);
}
if(Juge(x*2)&&!Used[x*2])
{
Used[x*2] = 1;
buf.x = x*2;
c.push(buf);
}
if(!c.empty())
bfs(c.front().x,c.front().step); ///搜索下一步
}
int main()
{
while(cin >> n >> k)
{
mem(Used,0);
ans = INF;
while(!c.empty())
c.pop(); ///上面的都是初始化数据
bfs(n,0);
cout <<ans << endl;
}
return 0;
}