BJFU 1399 警察抓小偷

来源:互联网 发布:日本发型知乎 编辑:程序博客网 时间:2024/04/30 07:39


警察抓小偷

时间限制(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[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;
}





0 0
原创粉丝点击