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());
}
}