Catch My Pet

题目描述

小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页中有介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值