哆啦A梦的时光机

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

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

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

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

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

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

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

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

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

样例输入

2
5 17
4 8

样例输出

8
2
思路:暴力宽搜

#include <iostream>
#include <queue>
using namespace std;

struct node {
	int t, s, d;
	node (int ss ,int tt, int dd ) {
		s = ss;
		t= tt;
		d =dd;
	}
};
int bfs(int s, int t) {
	queue<node> q;
	q.push(node(s,t,0));
	while(!q.empty()) {
		node now = q.front();
		q.pop();
		if(now.s == t) {
			return now.d*2;
		}


		int ts = now.s + 1;
		q.push(node(ts,t,now.d+1));
		ts = now.s - 1;
		q.push(node(ts,t,now.d+1));
		ts = 2 * now.s;
		q.push(node(ts,t,now.d+1));
		if (now.s % 2 == 0) {
			ts = now.s / 2;
			q.push(node(ts,t,now.d+1));
		}


	}
}
int main() {
	int N;
	int S, T;
	cin>>N;
	for (int i = 0; i < N; i++) {
		cin>>S>>T;
		cout<<bfs(S,T)<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41979221/article/details/88394631