警察抓小偷
总提交:12 测试通过:4
描述
警察知道小偷的位置,想要抓住它。警察和小偷都位于数轴上,警察起始位于点N(0<=N<=100000),小偷位于点N(0<=K<=100000)。
警察有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设小偷没有意识到警察的行动,站在原地不动。警察最少要花多少时间才能抓住小偷?
输入
有多组测试数据,每组一行,每行有两个数N,K。
输出
输出最短的时间.
样例输入
5 17
样例输出
4
本题原题为北大暑期培训第五期讲广搜时用到的例题
#include<iostream>
#include<queue>
using namespace std;
int a[100001],b[100001];
int main()
{
int k,n,y;
while(cin>>n>>k)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
queue<int>x;//建立名为x的队列
x.push(n);//在队列后加入n
a[n]=0;
while(x.size()!=0)//队列大小不为0
{
y=x.front();//y取队列首位
x.pop();//去掉队列首位
b[y]=1;
if(y==k)
break;
if(y-1>=0&&b[y-1]==0)
{
x.push(y-1);
a[y-1]=a[y]+1;
b[y-1]=1;
}
if(y+1<=100000&&b[y+1]==0)
{
x.push(y+1);
a[y+1]=a[y]+1;
b[y+1]=1;
}
if(2*y<=100000&&b[2*y]==0)
{
x.push(2*y);
a[2*y]=a[y]+1;
b[2*y]=1;
}
}
cout<<a[y]<<endl;
}
return 0;
}