题目描述
小A的宠物狗最近不听话了,经常乱跑,这不,小A又在找他的宠物狗了,好在小A在宠物狗身上安装了定位器,现在小A知道了宠物狗的位置,要去抓住宠物狗。小A和宠物狗在同一条直线上,小A起始位于点N(0<=N<=100000),宠物狗位于点K(0<=K<=100000)。小A有以下两种移动方式。
(1)从X移动到X-1或X+1,每次移动话费一分钟。
(2)从X移动到2X,每次移动花费一分钟。
假设宠物狗不知道小A在找他,站在原地不动。那小A最少要花多少时间才能抓住宠物狗?
输入
只有一行,N和K。
输出
抓到宠物狗要花到最少时间。
示例
输入:5 17
输出:4
思路
一道比较简单 典型的BFS题,需要注意边界条件。按照题目的三种方式进行搜索,搜索到就停止,输出的就是最短时间。
代码
#include<iostream>
#include<queue>
using namespace std;
struct times
{
int x;
int time;
times(int xx,int time1):x(xx),time(time1){}//结构体内部构造函数
};
int book[100000];//用来标记是否走过该地方
void bfs(int n,int k)
{
queue<times>q;
q.push(times(n,0));
book[n]=1;//走过的地方标记为1
while(!q.empty())
{
times b=q.front();
if(b.x==k)
{
cout<<b.time<<endl;
return ;
}
else
{
//用三种方式进行搜索
if(b.x-1>=0&&!book[b.x-1])
{
q.push(times(b.x-1,b.time+1));
book[b.x-1]=1;
}
if(b.x+1<=100000&&!book[b.x+1])
{
q.push(times(b.x+1,b.time+1));
book[b.x+1]=1;
}
if(b.x*2<=100000&&!book[b.x*2])
{
q.push(times(b.x*2,b.time+1));
book[b.x*2]=1;
}
q.pop();
}
}
}
int main()
{
int n,k;
cin>>n>>k;
bfs(n,k);
return 0;
}
这里运用了结构体构造函数的形式。结构体times中定义了一个函数名也是times的函数,但是没有返回值,这样的函数就是构造函数。构造函数是在声明变量时调用的,例如times a,b(1,2),就是分别调用了times()和times(1,2)。在算法入门经典105-106页中有介绍