中南大学复试上机:1024: 走路还是坐公交

1024: 走路还是坐公交

 

题目描述

你收到通知被中南大学录取了,高兴的来到了长沙,很快你就来到了岳麓南路上,已知你的位置是N,中南大学的位置是K。为了去中南大学,你有两种移动方式:走路或者坐公交。 

走路:你可以从位置X移动到X+1或者X-1 

搭公交车:你可以从位置X移动到2X 

每次走路或者搭公交车所需要的时间都是1分钟,你想尽快到达中南大学,所需的时间是多少呢? 

输入

多组数据。 

对于每组数据,输入一行,分别是N和K(0<=N,K<=100,000) 
 

输出

对于每组数据,输出一行,所需时间

样例输入

<span style="color:#333333"><span style="color:#333333">5 17</span></span>

样例输出

<span style="color:#333333"><span style="color:#333333">4</span></span>

来源/分类

 

#include<stdio.h>
int max = 100020;
int que[100020];
int book[100020];
int d[100020];//记录到根节点的距离 
int n,k;//n代表起点,k代表终点 
int bfs(){
	int i;
	for(i=0;i<max;i++){
		book[i]=0;
		d[i]=0; 
	}
	int head = 0;
	int tail = 0;
	book[tail]=1;
	que[tail++]=n;
	
	while(head<tail){
		int  u = que[head];
		head++;
		if(u==k)
		return d[u];
		if(2*u>=1 && 2*u<max && book[2*u]==0){
			que[tail++]=2*u;
			book[2*u]=1;
			d[2*u] = d[u]+1;
		}
		
		if(1+u>=1 && 1+u<max && book[1+u]==0){
			que[tail++]=u+1;
			book[1+u]=1;
			d[1+u] = d[u]+1;
		}
		
		if(u-1>=1 && u-1<max && book[u-1]==0){
			que[tail++]=u-1;
			book[u-1]=1;
			d[u-1] = d[u]+1;
		}
	
	} 
	return -1; 
}
int main(){
	while(scanf("%d%d",&n,&k)!=EOF){
		printf("%d\n",bfs());
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值