您的位置:首页 > 其它

[程序设计实习]时光机

2014-08-12 17:53 176 查看
描述

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

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

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

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

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

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

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

输入

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

输出

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

思路:与迷宫问题差不多,同样选择BFS,代码如下:

#include <iostream>
#include <string>
#include <string.h>
#include <queue>

using namespace std;

int visited[1000010];
struct Step{
int x;
int steps;
Step(int _x, int _s):x(_x),steps(_s){}
};

queue<Step> q;

int main(){
std::ios::sync_with_stdio(false);
int n;
cin >> n;
while (n--) {
int s, t;
cin >> s >> t;
memset(visited, 0, sizeof(visited));
q.push(Step(s, 0));
visited[s] = 1;
while (!q.empty()) {
Step s= q.front();
if(s.x == t) {
cout << s.steps * 2 << endl;
break;
} else {
if(s.x-1 >= 0 && !visited[s.x-1]) {
q.push(Step(s.x-1, s.steps+1));
visited[s.x-1] = 1;
}
if(s.x+1 <= 1000000 && !visited[s.x+1]) {
q.push(Step(s.x+1, s.steps+1));
visited[s.x+1] = 1;
}
if(s.x*2 <= 1000000 && !visited[s.x*2]) {
q.push(Step(s.x*2, s.steps+1));
visited[s.x*2] = 1;
}
if(s.x%2 ==0 && !visited[s.x/2]) {
q.push(Step(s.x/2, s.steps+1));
visited[s.x/ 2] = 1;
}
q.pop();
}
}
while (!q.empty())
q.pop();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: