哆啦 A 梦的时光机

哆啦 A 梦有一个神奇的道具:时光机。坐着它,大雄和他的伙伴们能穿越时空,回到过去或者去到未来。

有一天,大雄和他的伙伴们想穿越时空进行探险,可是时光机却出了一点故障,只能进行有限的时空穿越操作。大雄他们需要从现在出发,到达一个目标时间点进行探险,结束后再返回到现在,他们希望尽可能减少时光机的操作次数,你能帮助他们吗?

假设大雄和他的伙伴们出发的时间点(现在)为 S(0 < S < 1,000,000)S(0<S<1,000,000),希望到达的时间点(目标)为 T(0 < T < 1,000,000)T(0<T<1,000,000),已知时光机可以进行如下的时空穿越操作(XX 为正整数):

可以从任意时刻 XX 穿越到 X+1X+1 或者 X-1X−1 时刻

可以从任意时刻 XX 穿越到 X \times 2X×2 时刻

当 XX 为偶数时,可以从 XX 时刻穿越到 X/2X/2 时刻

请问,大雄和他的伙伴们从 SS 时刻出发,先到达 TT 时刻,再回到 SS 时刻最少需要多少次时空穿越操作?

输入格式

输入的第一个数是一个正整数 NN,表示测试数据一共有 NN 组(0 < N < 200<N<20)。之后有 NN 行,每一行包含两个正整数 SS 和 TT,表示出发和到达时间点。S \not = TS​=T

输出格式

输出包括 NN 行,每一行一个正整数,表示每组测试数据对应的最少时光机操作次数。

 

#include<cstdio>
#include<cstring>
#define Max 1000000
int vis[Max+1];
int qu[Max+1],pre[Max+1];
int s,t;
int next;
void print(int x) {
	int num=0;
	while(pre[x])
	{
		num++;
		x=pre[x];
	}
	printf("%d\n",num*2);
}
void bfs() {
	if(s==t){printf("0");return;}
	int head=0,tail=1;
	qu[1]=s;
	vis[s]=1;
	while(head!=tail)
	{
		head++;
		for(int i=0;i<4;i++)
		{
			if(i==0) next=qu[head]+1;
			if(i==1) next=qu[head]-1;
			if(i==2) next=qu[head]*2;
			if(i==3&&qu[head]%2==0) next=qu[head]/2;
			if(next>=0&&next<=Max&&vis[next]==0)
			{
				tail++;
				qu[tail]=next;
				vis[next]=1;
				pre[tail]=head;
				if(next==t)
				{
					print(tail);
					head=tail;
					break;
				}
			}
		}
	}
}
int main()
{
    freopen("dora.in","r",stdin);
    freopen("dora.out","w",stdout);    
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d%d",&s,&t);
		bfs();
		memset(vis,0,sizeof(vis));
		memset(qu,0,sizeof(qu));
		memset(pre,0,sizeof(pre));
		next=0;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值