您的位置:首页 > 其它

BJFU 1399 警察抓小偷

2015-07-29 17:23 155 查看


警察抓小偷

时间限制(C/C++):5000MS/10000MS 运行内存限制:65536KByte

总提交: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
=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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: