Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 40350 | Accepted: 12560 |
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
#include <iostream>
#include <deque>
#define MAX 100000
using namespace std;
struct ss
{
int n; // 记录当前坐标
int time; // 记录当前已走步数
};
int main()
{
int aim;
ss a;
while(cin>>a.n>>aim)
{
deque<ss> q;
bool use[MAX+1]={0}; //情况打表防重复
a.time=0;
q.push_back(a); // 压入队尾初始状态
ss present=q.front(); // 队头提出初始状态
q.pop_front(); // 删除队头
while(present.n!=aim) // 当前未找到目标
{
ss t; // 压入中转站
t.time=present.time+1; // 步数为当前加1
t.n=present.n-1; //坐标改变
if(t.n>=0&&t.n<=MAX) // 判断坐标是否满足条件
{
if(!use[t.n]) // 是否重复到达
{
q.push_back(t); // 满足条件且不重复到达就压入队尾
use[t.n]=true;
}
}
t.n=present.n+1;
if(t.n>=0&&t.n<=MAX)
{
if(!use[t.n])
{
q.push_back(t);
use[t.n]=true;
}
}
t.n=present.n<<1;
if(t.n>=0&&t.n<=MAX)
{
if(!use[t.n])
{
q.push_back(t);
use[t.n]=true;
}
}
present=q.front(); // 队头提出
q.pop_front(); // 删除队头
}
cout<<present.time<<endl;
}
return 0;
}